2017-08-17 56 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窗口来移动一个或多个文件。简单。 :-)