在NSCollectionView

时间:2017-02-19 15:58:22

标签: swift drag-and-drop nscollectionview

我想使用拖放委托方法在NSCollectionView内移动项目。我得到它的工作,直到该项目应该被删除。没有目标指示器(间隙),当释放鼠标时,项目正在弹回。代表validateDropacceptDrop永远不会被调用。 CollectionViewItems显示来自自定义对象的数据:

enter image description here

func collectionView(_ collectionView: NSCollectionView, canDragItemsAt indexPaths: Set<IndexPath>, with event: NSEvent) -> Bool {

    print("canDragItem", indexPaths)
    return true
}

func collectionView(_ collectionView: NSCollectionView, writeItemsAt indexPaths: Set<IndexPath>, to pasteboard: NSPasteboard) -> Bool {

    let indexData = Data(NSKeyedArchiver.archivedData(withRootObject: indexPaths))
    pasteboard.declareTypes(["my_drag_type_id"], owner: self)
    pasteboard.setData(indexData, forType: "my_drag_type_id")

    print("write data", indexData)
    return true
}


func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndex proposedDropIndex: UnsafeMutablePointer<Int>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionViewDropOperation>) -> NSDragOperation {

    print("validation")
    return NSDragOperation.move
}

func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, index: Int, dropOperation: NSCollectionViewDropOperation) -> Bool {

    let pb = NSPasteboard()
    let indexData = (pb.data(forType: "my_drag_type_id"))! as Data
    let indexPath = (NSKeyedUnarchiver.unarchiveObject(with: indexData)) as! IndexPath
    let draggedCell = indexPath.item as Int

    print("acceptDrop", draggedCell)


    return true
}

到底是什么......我认为编写要在粘贴板中拖动的项目数据有问题。任何建议。

1 个答案:

答案 0 :(得分:0)

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

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

其次,在我的实例中就是这种情况,请检查您是否记得要注册您希望集合视图响应某个合理位置的拖动类型,即viewDidLoad - 请参阅下面的代码段 - 和当然,首先在生成拖动数据时,在粘贴板中设置相同的拖动类型!

collectionView.register(forDraggedTypes: [dragType])