Swift。如何允许将 URL 从浏览器拖动到 NSView

Swift. How to allow dragging an URL from the browser to a NSView

我有一个 NSView,它接受拖放的文件并存储它们的文件URL,但我希望它也能接受从 Internet 浏览器拖拽的 HTTP URL。我的意思是,与将它拖到 Finder 以创建 .webloc 文件但在我的应用程序中的行为相同。 什么是正确的 PasteboardType 使用?我试过.fileContents, .urL, .fileURL, .html, .string…都没有用。

编辑:这是要求的相关代码:

    required init?(coder: NSCoder) {

    super.init(coder: coder)

    wantsLayer = true
    layer?.backgroundColor = NSColor.clear.cgColor

    registerForDraggedTypes([NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType"), .URL, .string, .html])
}

override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {

    showFrame(true)

    return .copy
}

override func draggingExited(_ sender: NSDraggingInfo?) {

    showFrame(false)
}

override func draggingEnded(_ sender: NSDraggingInfo) {

    showFrame(false)
}

override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {

    if let board = sender.draggingPasteboard.propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? NSArray
    {
        print("FILE: \(board)")
        return true
    } else if let board = sender.draggingPasteboard.propertyList(forType: .URL) as? NSArray {
        print("URL: \(board)")
        return true
    } else if let board = sender.draggingPasteboard.propertyList(forType: .string) as? NSArray {
        print("STRING: \(board)")
        return true
    } else if let board = sender.draggingPasteboard.propertyList(forType: .html) as? NSArray {
        print("HTML: \(board)")
        return true
    }

    return false
}

再次编辑:

我找到问题所在了。事实证明,我在这个 NSView 中有一个 tableview 并且它也注册了 .string 拖动类型(以便能够重新排序单元格)。似乎 table "swallows" URL 类型但让文件名通过。我必须处理这个问题,但这是另一个问题。

粘贴板上的数据不是 属性 列表并且 URL 不是 属性 列表兼容 class。使用 readObjects(forClasses:options:) 而不是 propertyList(forType:).

if let board = sender.draggingPasteboard().readObjects(forClasses: [NSURL.self]) {
    print("URL: \(board)")
    return true
}