我试图在一个带有NSBrowser控件的快速4 Macos应用程序中进行拖放工作。我目前掌握的代码如下:
// Drag and Drop
func browser(_ browser: NSBrowser,
canDragRowsWith rowIndexes: IndexSet,
inColumn column: Int,
with event: NSEvent) -> Bool {
if column != 0 {
quizBrowser.canDragRows(with: rowIndexes, inColumn: column, with: event)
return true
}
return false
}
func browser(_ browser: NSBrowser,
writeRowsWith rowIndexes: IndexSet,
inColumn column: Int,
to pasteboard: NSPasteboard) -> Bool {
if column != 0 {
let row: Int = rowIndexes.last!
let item = quizBrowser.item(atRow: row, inColumn: column) as? BrowserItem
pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: self)
pasteboard.setString(item!.name, forType: NSPasteboard.PasteboardType.string)
return true
}
return false
}
func browser(_ browser: NSBrowser,
validateDrop info: NSDraggingInfo,
proposedRow row: UnsafeMutablePointer<Int>,
column: UnsafeMutablePointer<Int>,
dropOperation: UnsafeMutablePointer<NSBrowser.DropOperation>) -> NSDragOperation {
return NSDragOperation.move
}
func browser(_ browser: NSBrowser,
acceptDrop info: NSDraggingInfo,
atRow row: Int,
column: Int,
dropOperation: NSBrowser.DropOperation) -> Bool {
let pboard = info.draggingPasteboard
let rowData = pboard().data(forType: NSPasteboard.PasteboardType.string)
return true
}我看到的是前两个函数被称为canDragRowsWith和writeRowswith,并且setString命令返回true,所以看起来值已经保存到了pasteboard。
但是其他两个函数并没有被调用。因此,虽然我可以看到NSBrowser中的行正在被拖动,但该控件似乎没有注册以接受下拉列表。我还在viewDidLoad函数中添加了这个
quizBrowser.setDraggingSourceOperationMask(NSDragOperation.generic, forLocal: true)有人知道我错过了什么吗?有谁有一个快速的3/4的例子拖放使用的NSBrowser,他们要分享?
谢谢
发布于 2018-10-12 22:34:16
在视图接收拖动操作之前,您需要注册它可以通过调用接受的数据类型。
func registerForDraggedTypes(_ newTypes: [NSPasteboard.PasteboardType])https://stackoverflow.com/questions/52786664
复制相似问题