NSPasteBoard for Drag and Drop

时间:2018-03-16 19:46:58

标签: drag-and-drop nscollectionview nspasteboard

我尝试在同一NSCollectionViewItem内移动NSCollectionView以允许重新排序项目。集合视图项是一个自定义项,表示包含自定义对象Parameter的字符串的多个标签:

class Parameter: NSObject {

var parameterName: String
var parameterNominal: Double
var parameterUpperTolerance: Double
var parameterLowerTolerance: Double
var parameterDistribution: String
var parameterNotes: String
var parameterDataArray: [Double]

// MARK: - Initialization Methods
...
}

现在,我是否必须将整个项目/对象写入' NSPasteboard'正确使用NSCollectionView内的拖放? 大多数拖放示例都适用于使用....register(forDraggedTypes: [NSPasteboardTypeString])将字符串写入粘贴板。

我目前将其中一个项目字符串写入粘贴板,拖放开始正常:

func collectionView(_ collectionView: NSCollectionView, pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting? {
    let pb = NSPasteboardItem()
    pb.setString(ParameterList.sharedInstance.parameters[indexPath.item].parameterName, forType: NSPasteboardTypeString)
    return pb
}

...但是在请求移动整个对象时,只将部分对象写入粘贴板看起来很奇怪,对吗?

如何将参数对象实际写入粘贴板(如果需要)?

使用拖放时,粘贴板中的数据会在场景后发生什么?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我还没有使用带有集合视图的粘贴板,但我有大纲视图。如果您只是重新排序内部拖动的项目,那么您并不需要完全使用粘贴功能 - 它旨在允许通用应用程序传递泛型类型。

你可以做相同的事情:

func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
    pasteboardItem.setString("Something to pass - not used", forType:MyConstants.pasteboardType)
    return pasteboardItem
}

您需要有一些内部缓存上述函数中拖动项目的方法。然后,在接受丢弃中,您只需检查您的粘贴板类型并使用缓存。