1

我正在尝试使用 NSBrowser 控件在 swift 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,所以看起来好像值已保存到粘贴板。

但是其他两个函数没有被调用。因此,虽然我可以看到 NSBrowser 中的行被拖动,但看起来控件没有注册以接受放置。我还在 viewDidLoad 函数中添加了这个

quizBrowser.setDraggingSourceOperationMask(NSDragOperation.generic, forLocal: true)

有谁知道我错过了什么?有没有人有一个他们愿意分享的使用 NSBrowser 的快速 3/4 拖放示例?

谢谢

4

1 回答 1

0

在视图可以接收拖动操作之前,您需要通过调用注册它可以接受的数据类型

func registerForDraggedTypes(_ newTypes: [NSPasteboard.PasteboardType])
于 2018-10-12T22:34:16.317 回答