2017-08-17 1 views
0

Je veux que mon application MacOS puisse faire glisser un élément de NSTableView vers une autre application comme Logic Pro X, Finder, etc. Les éléments de ce TableViews sont des classes que j'ai créées. représentent des fichiers sur mon HD.Xcode Cocoa - Drag Drop de 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; 
    } 
} 

Malheureusement, je ne peux pas trouver une solution pour Swift ou Objective-C que je pourrais traduire en C# (Xamarin). Est-ce que quelqu'un en connaît un ou a du code qui pourrait aider ici?

Merci pour votre aide!

Répondre

0

Je ne connais rien à C#, mais vous avez demandé une solution dans Swift ou Objective-C. Que je peux aider avec! Le dessous est rapide 4.

Tout d'abord, assurez-vous que votre ViewController est la source de données de la vue de la table:

class ViewController: NSViewController, NSTableViewDataSource 

Vous devrez également faire le lien soit en code ou en IB.

Vous devez ensuite définir votre vue de table en tant que source de déplacement. Choisissez l'opération que vous voulez, soit habituellement .move ou .copy:

tableView.setDraggingSourceOperationMask(.move, forLocal: false) 

Cet exemple suppose que vous utilisez un ArrayController pour gérer le contenu de la tableView. Tu devrais vraiment l'être, cela facilite beaucoup de choses. En outre, cet exemple est pour faire glisser plusieurs fichiers. (Il fonctionnera pour un seul fichier, mais il existe d'autres approches si vous ne jamais vouloir faire glisser un.)

Dans votre classe ViewController, mettre en œuvre cette méthode:

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 
} 

Vous pouvez en apprendre davantage sur la NSFilenamesPboardTypeTemp hack here.

Et c'est tout! Recompilez et vous devriez être capable de déplacer un ou plusieurs de vos fichiers en les faisant glisser vers une fenêtre du Finder. Simple. :-)