cocoa drag-and-drop nsoutlineview

cocoa - Arrastrar y soltar desde dentro de un NSOutlineView



drag-and-drop (2)

NSOutlineView un pequeño proyecto de muestra que tiene un NSOutlineView donde puede agregar y eliminar elementos.

Hoy he implementado el soporte de arrastrar y soltar basado en la respuesta de @Monolo ( ver cambios ).

Estoy tratando de averiguar cómo implementar arrastrar y soltar desde dentro de un NSOutlineView a sí mismo.

Por ejemplo, quiero que el usuario pueda reordenar, anidar y volver a anidar los elementos en NSOutlineView, pero no es necesario que pueda arrastrar elementos desde cualquier otra fuente (como archivos o desde otra vista).

Todos los ejemplos que puedo encontrar se refieren al arrastre de elementos en NSOutlineView, no solo dentro de sí mismo y parecen demasiado complejos. Supongo que esto es posible.

¿Puede alguien señalar algunos documentos que tratan solo este caso? Tal vez me estoy perdiendo lo obvio.


He encontrado que la documentación de esto no está nada clara, y entre otras cosas, las nuevas formas de hacerlo se agregaron en Lion.

Suponiendo que necesita esto para 10.7 o superior, entonces esto podría ser un esqueleto para su implementación:

En su fuente de datos / clase delegada, implemente:

// A method to register the view for dragged items from itself. // Call it during initialization -(void) enableDragNDrop { [self.outlineView registerForDraggedTypes: [NSArray arrayWithObject: @"DragID"]]; } - (id <NSPasteboardWriting>)outlineView:(NSOutlineView *)outlineView pasteboardWriterForItem:(id)item { // No dragging if <some condition isn''t met> if ( dontDrag ) { return nil; } // With all the blocking conditions out of the way, // return a pasteboard writer. // Implement a uniqueStringRepresentation method (or similar) // in the classes that you use for your items. // If you have other ways to get a unique string representation // of your item, you can just use that. NSString *stringRep = [item uniqueStringRepresentation]; NSPasteboardItem *pboardItem = [[NSPasteboardItem alloc] init]; [pboardItem setString:stringRep forType: @"DragID"]; return pboardItem; } - (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id < NSDraggingInfo >)info proposedItem:(id)item proposedChildIndex:(NSInteger)index { BOOL dragOK = // Figure out if your dragged item(s) can be dropped // on the proposed item at the index given if ( dragOK ) { return NSDragOperationMove; } else { return NSDragOperationNone; } } - (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id < NSDraggingInfo >)info item:(id)item childIndex:(NSInteger)index { // Move the dragged item(s) to their new position in the data model // and reload the view or move the rows in the view. // This is of course quite dependent on your implementation }

Hay que rellenar una gran cantidad de código para el último método, y con respecto al movimiento animado, el código de demostración de la vista de tabla compleja de Apple mencionado en el comentario de samir es bastante útil, aunque algo complejo de descifrar.