Xcode Cocoa - 从NSTableView拖放到Finder

时间:2017-08-17 12:17:42

标签: c# objective-c xcode cocoa xamarin

我希望我的MacOS应用程序能够将项目从NSTableView拖动到其他应用程序,如Logic Pro X,Finder等。 此TableView中的项目是我创建的类,它们代表我的HD上的文件。

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

不幸的是我无法找到Swift或Objective-C的解决方案,我可以将其转换为C#(Xamarin)。有没有人知道一个或有一些可以帮助的代码?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我对C#一无所知,但你要求在Swift或Objective-C中提供解决方案。我可以帮忙!以下是Swift 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 hack here

就是这样!重新编译,您应该能够通过将一个或多个文件拖动到Finder窗口来移动它们。简单。 : - )