2010-05-02 30 views
3

J'ai sous-classé NSCollectionView et j'essaie de recevoir des fichiers glissés à partir du Finder. Je reçois draggingEntered: et renvoie une valeur appropriée, mais je ne reçois jamais prepareForDragOperation: (ni aucune des méthodes après cela dans le processus). Y a-t-il quelque chose d'évident qui me manque ici?Accepter les opérations de glissement dans une sous-classe NSCollectionView

code:

- (void)awakeFromNib 
{ 
    [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; 
} 

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender 
{ 
    NSLog(@"entered"); //Happens 
    NSPasteboard *pboard; 
    NSDragOperation sourceDragMask; 

    sourceDragMask = [sender draggingSourceOperationMask]; 
    pboard = [sender draggingPasteboard]; 

    if ([[pboard types] containsObject:NSFilenamesPboardType]) 
    { 
     NSLog(@"copy"); //Happens 
     return NSDragOperationCopy; 
    } 

    return NSDragOperationNone; 
} 

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender 
{ 
    NSLog(@"prepare"); //Never happens 
    return YES; 
} 

Répondre

5

C'est assez tard, mais je trouve le problème:

NSCollectionView fournit en silence une implémentation incompatible de:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 

... et Apple n'a pas documenté cela. Si vous implémentez simplement cette méthode pour invoquer de nouveau la méthode draggingEntered, tout fonctionne très bien, par exemple:

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 
{ 
    return [self draggingEntered:sender]; 
} 

(je suis venu à l'espoir SO de trouver une explication de ce que la « magie » cette implémentation personnalisée fournit, depuis trop est ... non documenté (merci, Apple!) Je suppose qu'il fait quelque chose d'intelligent avec la gestion d'un point d'insertion dans le CollectionView?).

MISE À JOUR: il semble que la magie spéciale se trouve dans l'objet délégué de NSCollectionView. Pour une raison quelconque, Xcode4 prétendait qu'il n'y avait pas de délégué pour moi, mais l'assigner construit et fonctionnait bien. Découvrez toutes les méthodes glisser/déposer personnalisées/semi-documentées ici.

(ou tout simplement faire ce que je décris ci-dessus et remplacer le comportement personnalisé, et mettent en place quelque chose qui fonctionne et vous pouvez comprendre)

0

je suis passé par cela il y a un certain temps. Cela semblait contre-intuitif pour moi, mais la seule façon de le faire fonctionner était de configurer la vue de défilement associée comme cible de largage.

+0

Feels terrible à code; fonctionne très bien. Tant pis! – andyvn22

1

Vous pourriez vouloir essayer ces méthodes de délégués des NSCollectionViewDelegate Protocol

- (NSDragOperation)collectionView:(NSCollectionView *)collectionView validateDrop:(id <NSDraggingInfo>)draggingInfo proposedIndex:(NSInteger *)proposedDropIndex dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation; 
- (BOOL)collectionView:(NSCollectionView *)collectionView acceptDrop:(id <NSDraggingInfo>)draggingInfo index:(NSInteger)index dropOperation:(NSCollectionViewDropOperation)dropOperation; 

- (BOOL)collectionView:(NSCollectionView *)collectionView canDragItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event; 
- (NSImage *)collectionView:(NSCollectionView *)collectionView draggingImageForItemsAtIndexes:(NSIndexSet *)indexes withEvent:(NSEvent *)event offset:(NSPointPointer)dragImageOffset; 
- (NSArray *)collectionView:(NSCollectionView *)collectionView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropURL forDraggedItemsAtIndexes:(NSIndexSet *)indexes; 
- (BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard; 

Les deux premières méthodes en particulier.

+0

Ces méthodes de délégué semblent être pour glisser seulement des vues de collection, ainsi tristement, elles ne m'aident pas. (Je traîne du Finder). Mais cela fait probablement la lumière sur les raisons pour lesquelles cela ne fonctionne pas comme prévu ... Probablement que Apple a rendu mon travail plus difficile dans le but de faciliter le glisser à partir d'autres vues de collection. – andyvn22

+0

Il semble que NSCollectionViewDelegate n'est devenu disponible que dans 10.6, Snow Leopard. –