2017-06-14 49 views
7

遷移到Swift4下面的代碼加薪編譯錯誤後:Swift 4:NSFilenamesPboardType不可用。什麼使用registerForDraggedTypes來代替?

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) 
    } 
} 

哪些是Swift4 NSFilenamesPboardType更換?如何在Swift4中註冊拖動類型file name(在我的例子中是mp3,wav,aiff,... files)?

謝謝!

回答

3

我也遇到了同樣的問題,我的解決方案是使用kUTTypeURL創建自定義NSPasteboard.PasteboardType。我不確定這是否是最合適的方式(我想不是),但它至少適用於暫時的解決方法。

let draggedType = NSPasteboard.PasteboardType(kUTTypeURL as String) 
    self.tableView?.registerForDraggedTypes([draggedType]) 

此外,新NSPasteboard.PasteboardType具有.fileNameType(forPathExtension: "foo")方法。你應該試試看。但不知何故,這在我的情況下不起作用。

+3

作爲解決辦法也有可能這樣做:'NSPasteboard.PasteboardType (「NSFilenamesPboardType」)' – Vlad

8

我用這個作爲解決

//Temp solution for this 
    let NSFilenamesPboardTypeTemp = NSPasteboard.PasteboardType("NSFilenamesPboardType") 

    self.zipView.registerForDraggedTypes([NSFilenamesPboardTypeTemp]) 

它似乎從蘋果的錯誤,它們標誌着API的工作只有10.13。

i fire a bug to apple:)

+1

我也做了這個。看起來很危險,但正在爲我工​​作。 #yolo –

5

我已經解決了向後兼容性與此擴展:

extension NSPasteboard.PasteboardType { 

    static let backwardsCompatibleFileURL: NSPasteboard.PasteboardType = { 

      if #available(OSX 10.13, *) { 
       return NSPasteboard.PasteboardType.fileURL 
      } else { 
       return NSPasteboard.PasteboardType(kUTTypeFileURL as String) 
      } 

    }() 

} 

這意味着你可以使用NSPasteboard.PasteboardType.backwardsCompatibleFileURL

+0

嗯。它不適合我,我無法得到適當的拖動文件名;取而代之的是'Optional(file:///.file/id=6571367.2747208)'。 Hack-ish @slboat解決方案效果更好。 –

相關問題