cocoa - NSTableView y arrastrar y soltar desde Finder
drag-and-drop (1)
Un arrastre del Finder siempre es un arrastre de archivo, no un arrastre de imagen. Deberá admitir el arrastre de URL desde el Finder.
Para hacer eso, necesita declarar que quiere tipos de URL:
[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObject:(NSString*)kUTTypeFileURL]];
Puede validar los archivos de esta manera:
- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation
{
//get the file URLs from the pasteboard
NSPasteboard* pb = info.draggingPasteboard;
//list the file type UTIs we want to accept
NSArray* acceptedTypes = [NSArray arrayWithObject:(NSString*)kUTTypeImage];
NSArray* urls = [pb readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]]
options:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],NSPasteboardURLReadingFileURLsOnlyKey,
acceptedTypes, NSPasteboardURLReadingContentsConformToTypesKey,
nil]];
//only allow drag if there is exactly one file
if(urls.count != 1)
return NSDragOperationNone;
return NSDragOperationCopy;
}
A continuación, deberá extraer la URL nuevamente cuando se tableView:acceptDrop:row:dropOperation:
al tableView:acceptDrop:row:dropOperation:
cree una imagen a partir de la URL y luego haga algo con esa imagen.
Aunque está utilizando enlaces Cocoa, aún necesita asignar e implementar un objeto como NSTableView
de datasource
de su NSTableView
si desea utilizar los métodos de arrastre. La NSTableView
subclases de NSTableView
no servirá de nada porque los métodos de NSTableView
datos no están implementados en NSTableView
.
Solo necesita implementar los métodos relacionados con el arrastre en el objeto de origen de datos, no los que proporcionan datos de tabla ya que está utilizando enlaces para hacerlo. Es su responsabilidad notificar al controlador de array el resultado de la caída, ya sea llamando a uno de los métodos insertObject:atArrangedObjectIndex:
como insertObject:atArrangedObjectIndex:
o modificando la matriz de respaldo utilizando métodos de acceso que cumplan con la codificación de valor de clave.
Estoy intentando implementar arrastrar y soltar desde el Finder en una NSTableView de mi aplicación. La configuración utiliza un NSTableView
, un controlador de matriz que actúa como un origen de datos utilizando enlaces Cocoa a un almacén de datos Core.
Hice lo siguiente, básicamente siguiendo varias publicaciones de blog que encontré en SO y otros sitios:
En el awakeFromNib
of my view llamo:
[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObjects: NSPasteboardTypePNG, nil]];
Subclasé NSArrayController y agregué los siguientes métodos a mi subclase (el razonamiento para crear subclases es que el controlador de matriz necesita ser informado de la caída, ya que actúa como fuente de datos de la vista de tabla):
- (BOOL) tableView: (NSTableView *) aTableView acceptDrop: (id < NSDraggingInfo >) info row: (NSInteger) row dropOperation: (NSTableViewDropOperation)operation
Mi implementación para lo anterior solo se escribe en el registro y luego devuelve un SÍ booleano.
- (NSDragOperation) tableView: (NSTableView *) aTableView validateDrop: (id < NSDraggingInfo >) info proposedRow: (NSInteger) row proposedDropOperation: (NSTableViewDropOperation) operation
En IB tengo el controlador de array apuntando a mi subclase personalizada NSArrayController.
Resultado: nada. Cuando arrastro un PNG desde el escritorio a mi vista de tabla, no pasa nada y el archivo rebota felizmente en su origen. Debo estar haciendo algo mal, pero no entiendo qué. ¿Dónde estoy equivocado?