2017-10-26 6 views
1

MacOS 10.12でFinderが受け入れるペーストボードの種類は何ですか? 次のコードはTerminalやSublimeのような他のアプリケーションにドラッグしますが、Finderはそれを受け付けません。 PasteboardTypeの問題ですか、それとも他に何か不足していますか?スウィフト4ペーストからファインダー

override func viewDidLoad() { 
    super.viewDidLoad() 
    mediaInUseTableView.setDraggingSourceOperationMask(NSDragOperation.every, forLocal: false) 
} 
func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool { 
    var urls = [NSURL]() 
    var types = [NSPasteboard.PasteboardType]() 
//  types.append(NSPasteboard.PasteboardType(kUTTypeURL as String)) 
//  types.append(NSPasteboard.PasteboardType("NSURLPboardType")) 
    types.append(NSPasteboard.PasteboardType("NSFilenamesPboardType")) 
//  types.append(NSPasteboard.PasteboardType.string) 
    for row in rowIndexes{ 
     urls.append(self.mediaInUses[row].url.absoluteURL as NSURL) 
//   types.append(NSPasteboard.PasteboardType.fileNameType(forPathExtension: self.mediaInUses[row].url.pathExtension)) 
    } 
    pboard.declareTypes(types, owner: nil) 
    pboard.writeObjects(urls) 
    return true 
} 

よりpromesingタイプのカップル私の環境のために使用できないように見える:

NSFilenamesPboardType 
'NSFilenamesPboardType' is unavailable in Swift: use 'PasteboardType.fileURL' 
NSPasteboard.PasteboardType.fileURL 
'fileURL' is only available on OS X 10.13 or newer 

答えて

1

私は、Finderの独自のドラッグデータを自分のアプリケーションに落ち分析し、.declareTypes内のオブジェクトの無数のバリエーションをしようと時間を費やしました。 setPropertyListと.setDataです。私はそれが一度働いていた(!)、そして同じコードを再び破る。 私はまた、絶望したスウィフト3.2に切り替えました。今日、私はが実現しました。書き込みオブジェクトに基づいて上記すべてを自動化することになっており、他のアプリケーションでうまく機能する最小限の実装をテストしました。これがFinderでうまくいかなかったとき、私は問題が別の場所になければならないと確信しました。

仮説:Finderは無効な試行のためにアプリケーションをブラックリストに登録していました。

解決方法:コンピュータを再起動し、突然Finderがドラッグを受け入れました!

私は昨日もいくつか再起動しましたが、その時点ではおそらく実装が不良でした。

最小限の実装(スウィフト3/4):ここ

// Enable drag to other applications: 
tableView.setDraggingSourceOperationMask(NSDragOperation.every, forLocal: false) 
// Serve data for dragged table rows: 
func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool { 
    // Prepeare data: 
    var arrayOfNSURLs = [NSURL]() 
    for rowIndex in rowIndexes{ 
     arrayOfNSURLs.append(self.mediaFiles[rowIndex].url.absoluteURL as NSURL) 
    } 
    // Let API write objects automatically: 
    pboard.writeObjects(arrayOfNSURLs) 
    return true 
} 

は私の完全な実装(スウィフト3/4)です:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Enable global drag (to other applications) 
    mediaFilesTableView.setDraggingSourceOperationMask(NSDragOperation.every, forLocal: false) 
    sourceClipsTableView.setDraggingSourceOperationMask(NSDragOperation.every, forLocal: false) 
} 
func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool { 
    if tableView == self.mediaFilesTableView { 
     var arrayOfNSURLs = [NSURL]() 
     for row in rowIndexes{ 
      arrayOfNSURLs.append(self.mediaFiles[row].url.absoluteURL as NSURL) 
     } 
     pboard.writeObjects(arrayOfNSURLs) 
     return true 
    } 
    if tableView == self.sourceClipsTableView { 
     var names = [NSString]() 
     var info = "" 
     for row in rowIndexes{ 
      info = "\(self.sourceClips[row].mediaFiles.count)" 
      if info == "0"{ 
       info = "MISSING" 
      } 
      names.append(self.sourceClips[row].name.padding(toLength: 30, withPad: " ", startingAt: 0) + info as NSString) 
     } 
     pboard.writeObjects(names) 
     return true 
    } 
    return false 
} 

EDIT:スウィフト4に切り替え、これらの線はスイフト3と同じように見えます。

関連する問題