Dans cet article, je vais vous montrer comment on peut très simplement gérer le drag and drop de fichiers depuis le Finder vers votre application.
Il faut créer une sous-classe de NSView
, par exemple DropFilesView
. Dans cette classe, il faut indiquer à Cocoa que cette vue accepte la dépose de fichiers par drag and drop. Pour cela, on implémente la méthode -awakeFromNib
comme ceci :
- (void) awakeFromNib { [self registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, nil] ]; // Attention à ne pas oublier le "nil" en dernier argument de // arrayWithObjects ! } |
Je vous rappelle que la méthode -awakeFromNib
est appelée automatiquement lorsque votre application est chargée par Cocoa : c’est donc un emplacement judicieux pour initialiser des données propres à la vue. Il faut ensuite implémenter les méthodes suivantes, en fonction des besoins :
- (NSDragOperation)draggingEntered:(id )sender { // Appelée UNE FOIS lorsque la souris commence à survoler la vue // dans un processus de drag and drop. } - (NSDragOperation)draggingExited:(id )sender { // Appelée lorsque la souris quitte la zone de survol de la vue // dans un processus de drag and drop. } - (NSDragOperation)draggingUpdated:(id )sender { // Appelée à chaque fois que la souris est déplacée au dessus de la vue // dans un processus de drag and drop. } |
Ces trois méthodes retournent toutes une valeur de type NSDragOperation
, indiquant si la dépose est autorisée (NSDragOperationGeneric
, …) ou pas (NSDragOperationNone
). Ces méthodes peuvent donc servir à vérifier que la vue accepte bien les données qui sont sur le point d’être déposées, auquel cas on retourne une valeur autre que NSDragOperationNone
; si la dépose n’est pas permise, on retourne NSDragOperationNone
.
Enfin, il faut gérer le cas où l’utilisateur dépose effectivement les fichiers, auquel cas la méthode -performDragOperation:
est appelée : il convient donc de la surcharger à votre guise…
- (BOOL)performDragOperation:(id)sender { // Appelée lorsque l'utilisateur a déposer les fichiers sur la vue : // on doit alors récupérer la liste des fichiers et les traiter... NSPasteboard *pboard = [sender draggingPasteboard]; if ( [[pboard types] containsObject:NSFilenamesPboardType] ) { NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; // files contient maintenant la liste des fichiers (avec chemin complet) // qui ont été déposés sur la vue par l'utilisateur. // Faites donc ici ce que vous voulez avec files ;-) } return YES; // On indique que le drag and drop a été concluant. } |
Vous pouvez télécharger le projet complet pour Xcode : DropFilesTutorial.zip.
Petite précision : les fichiers obtenus depuis le
NSPasteboard
ne sont pas forcément classés alphabétiquement.