2017-08-17 7 views
0

Ich möchte meine MacOS App in der Lage sein, ein Element von NSTableView zu einer anderen Anwendung wie Logic Pro X, Finder, etc. zu ziehen. Die Elemente in diesem TableViews sind Klassen, die ich erstellt habe repräsentieren Dateien auf meiner HD.Xcode Cocoa - Drag Drop von NSTableView zum 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; 
    } 
} 

Leider kann ich keine Lösung für Swift oder Objective-C finden, die ich auf C# (Xamarin) übersetzen könnte. Kennt jemand einen oder hat Code, der hier helfen könnte?

Danke für Ihre Hilfe!

Antwort

0

Ich weiß nichts über C#, aber Sie haben nach einer Lösung in Swift oder Objective-C gefragt. Das kann ich helfen! Die unten ist Swift 4.

Zunächst einmal sicher, dass Ihr ViewController ist die Datenquelle des Tabellenansicht:

class ViewController: NSViewController, NSTableViewDataSource 

Sie auch, dass die Verbindung vornehmen müssen entweder im Code oder in IB.

Sie müssen dann Ihre Tabellenansicht als Ziehquelle festlegen. Wählen Sie den Vorgang, den Sie möchten, in der Regel entweder .move oder .copy:

tableView.setDraggingSourceOperationMask(.move, forLocal: false) 

Dieses Beispiel geht davon aus, dass Sie einen Arraycontroller verwenden den Inhalt der Tableview zu verwalten. Du solltest es wirklich sein, es macht eine Menge Dinge einfacher. In diesem Beispiel werden auch mehrere Dateien gezogen. (Es wird für eine einzelne Datei arbeiten, aber es gibt auch andere Ansätze, wenn man immer nur einen ziehen mag.)

In Ihrer Viewcontroller Klasse, implementieren diese Methode:

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 
} 

Sie können mehr über das erfahren NSFilenamesPboardTypeTemp hacken here.

Und das war's! Neu kompilieren und Sie sollten in der Lage sein, eine oder mehrere Ihrer Dateien zu verschieben, indem Sie sie in ein Finder-Fenster ziehen. Einfach. :-)