Frage

Ich habe subclassed NSCollectionView und ich versuche geschleppt Dateien aus dem Finder zu empfangen. Ich erhalte draggingEntered: und einen entsprechenden Wert zurückkehrt, aber ich bin nie empfangen prepareForDragOperation: (noch eine der Methoden nach, dass im Prozess). Gibt es etwas offensichtlich fehle ich hier?

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;
}
War es hilfreich?

Lösung

Das ist ziemlich spät, aber ich fand das Problem:

NSCollectionView bietet leise eine inkompatible Implementierung:

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

... und Apple hat dies nicht dokumentiert. Wenn Sie einfach diese Methode implementieren Wieder invoke die draggingEntered Methode, funktioniert alles einwandfrei, z.

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

(Ich kam SO zu der Hoffnung, eine Erklärung, was „Magie“ zu finden sind diese kundenspezifische Implementierung bietet, da auch das ist ... ohne Papiere (Danke, Apple!). Ich vermute, tut es etwas Gescheites mit einem Einführungs Verwaltung -Punkt im Collection?).

UPDATE: Es scheint die besondere Magie im Inneren des Delegierten des Objekts NSCollectionView ist. Aus irgendeinem Grunde wurde behauptet Xcode4 es gab keinen Delegierten für mich, aber es gebaut und läuft OK zuweisen. Schauen Sie sich alle benutzerdefinierten / Halb dokumentiert Drag / Drop-Methoden gibt.

(oder einfach nur tun, wie ich oben beschrieben, und das benutzerdefinierte Verhalten ändern, und implementieren etwas, das funktioniert und Sie können verstehen)

Andere Tipps

Sie können diese Delegatmethoden aus dem 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;

Die ersten beiden Methoden im Besonderen.

Ich ging durch diese vor einer Weile. Es schien nicht eingängig zu mir, aber der einzige Weg, ich es an die Arbeit konnte, war die zugehörige Scroll-Ansicht als Ziel des Ablege einzurichten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top