cocoa drag-and-drop finder

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?