Pregunta

He subclase NSCollectionView y estoy tratando de recibir archivos arrastrados desde el Finder. Estoy recibiendo draggingEntered: y devolver un valor apropiado, pero nunca estoy recibiendo prepareForDragOperation: (ni ninguno de los métodos después de que en el proceso). ¿Hay algo obvio que me falta aquí?

Código:

- (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;
}
¿Fue útil?

Solución

Esto es bastante tarde, pero he encontrado el problema:

NSCollectionView silencio proporciona una implementación incompatible de:

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

... y Apple no ha documentado esto. Si simplemente poner en práctica ese método para volver a invocar el método draggingEntered, todo funciona bien, por ejemplo:.

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

(llegué a la esperanza Así que para encontrar una explicación de lo "mágico" esta implementación personalizada proporciona, ya que eso también es ... indocumentados (gracias, Apple!). Supongo que hace algo inteligente con la gestión de una inserción -Punto dentro del CollectionView?).

ACTUALIZACIÓN: Parece que la magia especial está dentro del objeto delegado de la NSCollectionView. Por alguna razón, Xcode4 afirmaba que no había delegado para mí, pero la asignación construyó y gestionó bien. Echa un vistazo a todos los métodos de la costumbre / arrastre semi-documentado de inserción / extracción allí.

(o simplemente hacer lo que describo arriba y anular el comportamiento personalizado, y poner en práctica algo que funciona y se puede entender)

Otros consejos

Es posible que desee probar estos métodos delegado de la Protocolo 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;

Los dos primeros métodos en particular.

Me pasó por esto hace un tiempo. Parecía contrario a la intuición para mí, pero la única manera de que pudiera conseguir que el trabajo fue establecer la vista de desplazamiento asociada como el destino de colocación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top