Vla*_*lad 13 macos cocoa drag-and-drop swift swift4
迁移到Swift4后,以下代码引发编译错误:
public final class MediaItemView: NSView {
public override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
// error: 'NSFilenamesPboardType' is unavailable in Swift:
// use 'NSPasteboard.writeObjects(_:)' with file URLs
let draggedTypes: [NSPasteboard.PasteboardType] = [NSFilenamesPboardType]
registerForDraggedTypes(draggedTypes)
}
}
Run Code Online (Sandbox Code Playgroud)
什么是NSFilenamesPboardTypeSwift4 的替代品?如何file name在Swift4中注册拖动类型(在我的情况下是mp3,wav,aiff,...文件)?
谢谢!
Mar*_*ges 16
我已经解决了与此扩展的向后兼容性问题:
extension NSPasteboard.PasteboardType {
static let backwardsCompatibleFileURL: NSPasteboard.PasteboardType = {
if #available(OSX 10.13, *) {
return NSPasteboard.PasteboardType.fileURL
} else {
return NSPasteboard.PasteboardType(kUTTypeFileURL as String)
}
} ()
}
Run Code Online (Sandbox Code Playgroud)
这意味着你可以使用 NSPasteboard.PasteboardType.backwardsCompatibleFileURL
slb*_*oat 10
我用它作为解决方案
//Temp solution for this
let NSFilenamesPboardTypeTemp = NSPasteboard.PasteboardType("NSFilenamesPboardType")
self.zipView.registerForDraggedTypes([NSFilenamesPboardTypeTemp])
Run Code Online (Sandbox Code Playgroud)
这似乎是来自苹果的一个错误,他们只将api标记为10.13中的工作.
我喜欢此处为不推荐使用的变量提供的创造性解决方法NSFilenamesPboardType。寻找到这个问题后,想以此与前进等效的非过时的方法是使用readObjects(forClasses:options:)。WRT能够在未来的macOS上运行也将更加安全。它将像以下示例一样实现,该示例基于在NSView故事板中进行了注册,并通过Swift 4.1进行了测试。
override func awakeFromNib()
{
registerForDraggedTypes([.fileURL])
}
override func draggingEnded(_ sender: NSDraggingInfo)
{
sender
.draggingPasteboard()
.readObjects(forClasses: [NSURL.self],
options: nil)?
.forEach
{
// Do something with the file paths.
if let url = $0 as? URL { print(url.path) }
}
}
Run Code Online (Sandbox Code Playgroud)
由于for的类数组参数readObjects的类型[AnyClass]是使用NSURL代替的原因URL。
我也遇到了同样的问题,我的解决方案是NSPasteboard.PasteboardType使用kUTTypeURL. 我不确定这是否是最正确的方法(我想不是),但它至少适用于临时解决方法。
let draggedType = NSPasteboard.PasteboardType(kUTTypeURL as String)
self.tableView?.registerForDraggedTypes([draggedType])
Run Code Online (Sandbox Code Playgroud)
此外,新NSPasteboard.PasteboardType有.fileNameType(forPathExtension: "foo")方法。你应该尝试一下。然而不知何故,它对我来说不起作用。