Swift 4:NSFilenamesPboardType不可用.使用什么代替registerForDraggedTypes?

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中的工作.

我给苹果发了一个bug :)


Dan*_*ang 6

我喜欢此处为不推荐使用的变量提供的创造性解决方法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


102*_*4jp 4

我也遇到了同样的问题,我的解决方案是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")方法。你应该尝试一下。然而不知何故,它对我来说不起作用。

  • 作为解决方法,也可以这样做:`NSPasteboard.PasteboardType("NSFilenamesPboardType")` (3认同)