2009-05-04 17 views
12

Tengo un NSTableView en el que deseo permitir que los usuarios arrastren y suelten archivos de video. Cuando dejan caer el archivo, se agregará como una fila en la vista de tabla.¿Arrastrar y colocar archivos en un NSTableView?

¿Cómo voy a hacer esto? Actualmente la tableview de toma sus datos de un controlador de matrices (que toma sus datos de una NSMutableArray)

encontré this documentación, pero parece que no puede hacer que funcione ..

tengo ..

  • hizo una clase "TableCon" (que he cambiado a heredar de NSTableView, no NSObject)
  • cambió la clase NSTableView a TableCon
  • conjunto de salida delegado del NSTableView a esa clase
  • llamada registerForDraggedTypes en init del TableCon
  • implementado - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender; (de nuevo en TableCon)

..pero, nada, actúa como si nunca hubiera cambiado nada (sin errores), ¿qué estoy haciendo mal?

Editar: He intentado implementar la sugerencia de Boaz Stuller, y también encontré this descripción de la solución (la first reply incluye la solución a la primera entrada). Así que lo que he hecho ahora es ..

  • Subclase NSArrayController que alimenta el contenido de la vista de tabla (TableListCon)
  • Añadir tableView salida a TableListCon (y apuntó a la NSTableView)
  • Implementar validateDrop, writeRowsWithIndexes y acceptDrop en TableListCon
  • Llamado registerForDraggedTypes en tableView outlet.

Una vez más, no hay errores/advertencias, pero sólo el método awakeFromNib parece ser llamado (ninguno de los otros métodos son llamados)

+2

Esos son métodos de fuente de datos. Debe conectar la fuente de datos de la vista de tabla a la clase que implementa esos métodos para que puedan ser llamados. –

+1

¡Ohhhhh, eso es lo que estaba haciendo mal! Por "fuente de datos", asumí que significaba el controlador de array. Todo está funcionando perfectamente ahora, ¿podría agregar esa información a su respuesta para que yo pueda aceptarla? Gracias Boaz! – dbr

Respuesta

21

NSTableView maneja de arrastrar y soltar de manera diferente a partir de las vistas genéricas, que es en general una cosa buena. Significa que no tiene que manejar manualmente el resaltado complicado, el seguimiento de celda y los comportamientos de inserción que requieren las tablas.

Se puede encontrar una descripción de lo que se requiere here. Básicamente, todavía llama -registerDraggedTypes: (generalmente en su método -awakeFromNib) pero en lugar de implementar los métodos NSDraggingDestination, implementa los diversos métodos de origen de datos asociados con arrastrar y soltar, que se pueden encontrar here. No debería necesitar subclasificar NSTableView para implementar arrastrar y soltar de esta manera.

Tenga en cuenta que se trata de métodos de fuente de datos. Debe conectar la fuente de datos de la vista de tabla a la clase que implementa esos métodos para que puedan ser llamados.

+1

Desafortunadamente, parece que su primer enlace está ahora muerto. No estoy seguro de cuál es el reemplazo. – jtbandes

1

Además de lo que dijo Boaz, parece que está creando una subclase NSTableView y luego haciendo una instancia de esa subclase el delegado de NSTableView.Si vas a crear una subclase, esa subclase se debe usar en lugar de NSTableView, no además de esta. Además, casi siempre es una violación de las preocupaciones tener una vista ser un delegado para otro objeto.

Cuestiones relacionadas