Swift 在NSCollectionView中拖放的示例

Swift 在NSCollectionView中拖放的示例,swift,drag-and-drop,nscollectionview,Swift,Drag And Drop,Nscollectionview,我想使用拖放委托方法在NSCollectionView中移动项目。我让它一直工作,直到物品掉下来。没有目标指示器(间隙),释放鼠标时,项目会反弹回来。委托validateDrop和acceptDrop从未被调用。CollectionViewItems显示来自自定义对象的数据: func collectionView(\collectionView:NSCollectionView,canDragItemsAt indexPaths:Set,带有事件:NSEvent)->Bool{ 打印(“ca

我想使用拖放委托方法在
NSCollectionView
中移动项目。我让它一直工作,直到物品掉下来。没有目标指示器(间隙),释放鼠标时,项目会反弹回来。委托
validateDrop
acceptDrop
从未被调用。
CollectionViewItems
显示来自自定义对象的数据:

func collectionView(\collectionView:NSCollectionView,canDragItemsAt indexPaths:Set,带有事件:NSEvent)->Bool{
打印(“canDragItem”,indexPaths)
返回真值
}
func collectionView(collectionView:NSCollectionView,writeItemsAt indexPaths:Set,到粘贴板:NSPasteboard)->Bool{
让indexData=Data(NSKeyedArchiver.archivedData(withRootObject:indexPaths))
粘贴板.declareTypes([“我的拖拽类型”\u id],所有者:self)
setData(indexData,forType:“我的拖动类型id”)
打印(“写入数据”,索引数据)
返回真值
}
func collectionView(uCollectionView:NSCollectionView,validateDrop DragginInfo:nsDragginInfo,proposedIndex proposedDropIndex:UnsafemeutablePointer,dropOperation proposedDropOperation:UnsafemeutablePointer)->NSDragOperation{
打印(“验证”)
返回nsdragooperation.move
}
func collectionView(collectionView:NSCollectionView,acceptDrop DragginInfo:nsDragginInfo,index:Int,dropOperation:NSCollectionViewDropOperation)->Bool{
设pb=NSPasteboard()
让indexData=(pb.data(forType:“my\u drag\u type\u id”)!作为数据
让indexPath=(NSKeyedUnarchiver.unarchiveObject(with:indexData))作为!indexPath
将draggedCell=indexPath.item设为Int
打印(“acceptDrop”,draggedCell)
返回真值
}

见鬼。。。我认为在粘贴板中写入要拖动的项目数据有问题。任何建议。

此问题可能有两个原因。在这个具体案例中,威勒克的回答是正确的。实际上,您仍然可以使用所有拖放委托函数的旧indexSet版本,但是如果您这样做,那么您必须确保所有这些函数都是旧版本,没有新旧混合

简而言之,如果您的
canDragItems:
委托函数有一个名为indexPaths的参数,那么请确保
writeItemsAt:
validateDrop:
acceptDrop:
函数也使用indexPaths,而不是indexset

其次,在我的例子中就是这样,检查您是否记得注册要集合视图响应的拖动类型,也就是说,
viewDidLoad
——请参见下面的代码片段——当然,当首先生成拖动数据时,在粘贴板中设置了相同的拖动类型

collectionView.register(forDraggedTypes: [dragType])

检查方法的声明。”“路径”丢失。@Willeke感谢您的回复,但您的意思是什么?哪条路不见了呢?谢谢您的
validateDrop
acceptDrop
函数没有正确的参数。新版本有一个
proposedIndexPath
indexPath
参数.Mhm,很有趣。我采用了XCode建议的方法。“我会查清楚的。”威勒克在我的情况下,这就是问题的原因。Xcode autocomplete仍然建议使用旧版本,它仍然在NSCollectionView.h中,但没有提到它不再有效。您能否将其作为答案提交,以便将问题标记为已回答?collectionView.registerForDraggedTypes在Swift 4中重命名
collectionView.register(forDraggedTypes: [dragType])