用于拖放的 NSPasteBoard

NSPasteBoard for Drag and Drop

我尝试在同一个 NSCollectionView 中移动一个 NSCollectionViewItem 以允许重新排序项目。集合视图项是一个自定义项,表示多个标签,其中包含来自自定义对象的字符串 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
...
}

现在,我是否必须将整个 item/object 写入 '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
}

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

如何才能真正将我的参数对象写入粘贴板(如果需要)?

使用拖放操作时,粘贴板中的数据在幕后发生了什么?

非常感谢!

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

你可以这样做:

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

您需要有某种方法在内部缓存上述函数中的拖动项。然后,在 accept drop 中,您只需检查您的粘贴板类型并使用您的缓存。