swift - NSCollectionView 内拖放示例

标签 swift drag-and-drop nscollectionview

我想使用其拖放委托(delegate)方法在 NSCollectionView 内移动项目。我让它工作直到该元素被丢弃。没有目标指示器(间隙),当释放鼠标时,项目会弹回来。委托(delegate) 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
}

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

最佳答案

导致此问题的可能原因有两个。在这个具体案例中,威勒克的回答是正确的。事实上,您仍然可以使用所有拖放委托(delegate)函数的旧索引集版本,但如果您这样做,则必须确保所有这些都是旧版本,不能混合旧版本和旧版本新!

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

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

collectionView.register(forDraggedTypes: [dragType])

关于swift - NSCollectionView 内拖放示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329390/

相关文章:

ios - 无法弄清楚为什么我在 Swift iOS 应用程序代码中收到 "Class ViewController has no initializers"错误

ios - Xcode 7.0.1 - 无效的 Swift 支持 - cocoapods 如何修复?

swift - 解释方法对数组的影响

ios - 在 Swift 中使用定时器

javascript - 如何制作像Wordpress这样的图片 uploader ?

swift - NSCollectionView sizeForItemAt 在尝试引用其集合中的项目时始终返回异常

c++ - 如何跟踪拖放操作的生命周期?

JavaFX 拖放交互对象

objective-c - 如何将图像设置到 NSCollectionView 中?

cocoa - 从 NSScrollView/NSCollectionView 中删除边框