Domanda

Ho una sottoclasse NSCollectionView e sto cercando di ricevere file trascinati dal Finder. Ricevo draggingEntered: e restituendo un valore appropriato, ma sto mai ricevere prepareForDragOperation: (né alcuno dei metodi dopo che nel processo). C'è qualcosa di ovvio che mi manca qui?

Codice:

- (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;
}
È stato utile?

Soluzione

Questo è piuttosto tardi, ma ho trovato il problema:

NSCollectionView fornisce silenzio un'implementazione incompatibile di:

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

... e Apple non ha documentato questo. Se semplicemente implementare tale metodo per ri-richiamare il metodo draggingEntered, tutto funziona bene, per esempio:.

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

(Sono venuto a sperando SO di trovare una spiegazione di ciò che "magica" questa implementazione personalizzata prevede, dal momento che anche questo è ... non documentati (grazie, Apple!). Sto indovinando che fa qualcosa di intelligente con la gestione di un inserimento -Point all'interno del CollectionView?).

UPDATE: sembra la magia speciale è all'interno oggetto delegato del NSCollectionView. Per qualche ragione, Xcode4 rivendicava non c'era delegato per me, ma l'assegnazione è costruito e corse OK. Scopri tutti i metodi del custom / trascinare semi-documentata / drop lì.

(o semplicemente fare come ho descritto sopra e ignorare il comportamento personalizzato, e implementare qualcosa che funziona e si può capire)

Altri suggerimenti

Si potrebbe desiderare di provare questi metodi delegato dal NSCollectionViewDelegate protocollo

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

I primi due metodi in particolare.

I ha attraversato questo qualche tempo fa. Sembrava controintuitivo per me, ma l'unico modo ho potuto ottenere per il lavoro è stato quello di impostare la vista di scorrimento associato come la destinazione di rilascio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top