2012-04-25 13 views
10

Estoy tratando de implementar arrastrar y soltar desde el Finder en una NSTableView de mi aplicación. La configuración usa un NSTableView, un controlador de matriz que actúa como un origen de datos utilizando enlaces Cocoa a un almacén de datos centrales.NSTableView y arrastre y suelte desde Finder

hice lo siguiente, siguiendo básicamente diferentes entradas del blog he encontrado en SO y otros sitios:

En el awakeFromNib de mi controlador de vista que llamo:

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObjects: NSPasteboardTypePNG, nil]]; 

I subclases NSArrayController y añade la siguiente métodos para 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 actualmente 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 matriz 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?

Respuesta

17

Un arrastre del Finder es siempre un arrastre de archivo, no una imagen de arrastre. Deberá admitir el arrastre de URL desde el Finder.

Para hacer eso, tiene que declarar que desea 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, tendrá que extraer la URL de nuevo cuando se llama al método tableView:acceptDrop:row:dropOperation:, cree una imagen desde la URL y luego haga algo con esa imagen.

Aunque está utilizando enlaces Cocoa, aún necesita asignar e implementar un objeto como datasource de su NSTableView si desea utilizar los métodos de arrastre. La creación de subclases NSTableView no servirá de nada porque los métodos del origen de datos no están implementados en NSTableView.

Solo necesita implementar los métodos relacionados con el arrastre en su 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 NSArrayController como insertObject:atArrangedObjectIndex: o modificando la matriz de respaldo utilizando métodos de acceso que cumplan con la clave de codificación.

+0

Gracias, pero la vista de tabla todavía no acepta ninguna acción de arrastrar/soltar. Cualquier archivo que arrastre del Finder rebota ... Sí uso enlaces Cocoa para adjuntar la tabla a su fuente de datos. – Roger

+0

He actualizado mi respuesta. Aún necesita implementar un objeto de fuente de datos. –

Cuestiones relacionadas