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
}
我有一个 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
}