我希望我的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)。有没有人知道一个或有一些可以帮助的代码?
感谢您的帮助!
答案 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窗口来移动它们。简单。 : - )