Question

Je l'ai sous-classé et je NSCollectionView essaie de recevoir des fichiers glissés à partir du Finder. Je reçois draggingEntered: et retourner une valeur appropriée, mais je ne suis jamais reçu prepareForDragOperation: (ni aucune des méthodes après que, dans le processus). Y at-il quelque chose d'évident que je suis absent ici?

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;
}
Était-ce utile?

La solution

Ceci 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 dans l'espoir SO de trouver une explication de ce que la « magie » cette implémentation personnalisée offre, car cela aussi est ... sans papier (merci, Apple!). Je devine qu'il fait quelque chose d'intelligent avec la gestion d'une insertion -Point dans le CollectionView?).

Mise à jour: il semble que la magie est à l'intérieur de l'objet délégué du NSCollectionView. Pour une raison quelconque, Xcode4 prétendait qu'il n'y avait pas délégué pour moi, mais lui attribuer construit et RAN OK. Consultez toutes les méthodes personnalisées / glisser / déposer semi-documenté là.

(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)

Autres conseils

Vous pouvez essayer ces méthodes de délégué de la Protocole NSCollectionViewDelegate

- (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.

je suis passé par ce tout à l'heure. Il me semblait contre-intuitif, mais la seule façon que je pouvais le faire au travail était de mettre en place la vue de défilement associée comme la cible de dépôt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top