2017-08-17 78 views
0

我希望我的MacOS應用程序能夠將項目從NSTableView拖動到其他應用程序,如Logic Pro X,Finder等。 此TableViews中的項目是我創建的類在HD上代表文件。Xcode可可 - 從NSTableView拖放到Finder

public class AudioFile 
{ 
    #region Computed Propoperties 
    public string Filename { get; set; } = ""; 
    public string Filepath { get; set; } = ""; 
    #endregion 

    public AudioFile() 
    { 
    } 

    public AudioFile(string filename, string filepath) 
    { 
     this.Filename = filename; 
     this.Filepath = filepath; 
    } 
} 

不幸的是,我找不到可以轉換爲C#(Xamarin)的Swift或Objective-C的解決方案。有人知道一個或有一些代碼可以在這裏幫助嗎?

感謝您的幫助!

回答

0

我對C#一無所知,但你在Swift或Objective-C中尋求解決方案。我可以幫忙!以下是雨燕4

首先,確保你的ViewController是表視圖的數據源:

class ViewController: NSViewController, NSTableViewDataSource 

你也將需要無論是在代碼或IB該連接。

然後您需要將您的表格視圖設置爲拖動源。選擇你想要的操作,通常要麼.move.copy

tableView.setDraggingSourceOperationMask(.move, forLocal: false) 

該示例假設您使用的是ArrayController管理的tableView的內容。你真的應該這樣做,它使得很多事情變得更容易。另外,這個例子用於拖拽多個文件。 (它將單個文件的工作,但也有,如果你永遠只能想拖一個其他的方法。)

在你的ViewController類,實現此方法:

func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool { 
    var filePaths = [String]() 

    // Swift 4 hack--the FilenamesPboardType is missing 
    let NSFilenamesPboardTypeTemp = NSPasteboard.PasteboardType("NSFilenamesPboardType") 
    pboard.addTypes([NSFilenamesPboardTypeTemp], owner: nil) 

    if let audioFiles = audioFilesArrayController.arrangedObjects as? [AudioFile] { 
     for i in rowIndexes { 
      filePaths.append(audioFiles[i].Filepath) 
     } 
    } 

    pboard.setPropertyList(filePaths, forType: NSFilenamesPboardTypeTemp) 

    return true 
} 

您可以瞭解更多有關NSFilenamesPboardTypeTemp黑客here

就是這樣!重新編譯,您應該能夠通過將其拖動到Finder窗口來移動一個或多個文件。簡單。 :-)