Pregunta

Tengo un NSTableView que deseo permitir a los usuarios arrastrar y soltar archivos de video. Cuando sueltan el archivo, se agregará como una fila en la vista de tabla.

¿Cómo haría para hacer esto? Actualmente, la vista de tabla toma sus datos de un controlador de matriz (que toma sus datos de una matriz NSMutableArray)

Encontré esta documentación, pero parece que no puede hacer que funcione ..

Tengo ..

  • hizo un " TableCon " clase (que cambié para heredar de NSTableView, no NSObject)
  • cambió la clase NSTableView a TableCon
  • establezca la salida delegada del NSTableView a esa clase
  • llamado registerForDraggedTypes en el inicio de TableCon
  • implementado - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender; (nuevamente 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é esta descripción de la solución ( primera respuesta incluye la solución a la primera publicación). Entonces, lo que he hecho ahora es ...

  • Subclase NSArrayController que alimenta el contenido a la vista de tabla (TableListCon)
  • Agregue tableView salida a TableListCon (y apunte a NSTableView)
  • Implemente validateDrop, writeRowsWithIndexes y acceptDrop en TableListCon
  • Llamado registerForDraggedTypes en la salida tableView.

Nuevamente, no hay errores / advertencias, pero solo se llama al método awakeFromNib (ninguno de los otros métodos se llama)

¿Fue útil?

Solución

NSTableView maneja arrastrar y soltar de manera diferente a las vistas genéricas, lo que en general es algo bueno. Significa que no tiene que manejar manualmente los comportamientos complicados de resaltado, seguimiento de celdas e inserción que requieren las tablas.

Se puede encontrar una descripción de lo que se requiere aquí . Básicamente, todavía llama a -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 aquí . No debería necesitar subclasificar NSTableView para implementar arrastrar y soltar de esta manera.

Tenga en cuenta que esos son métodos de fuente de datos. Debe conectar la salida de dataSource de la vista de tabla a la clase que implementa esos métodos para poder llamarlos.

Otros consejos

Además de lo que dijo Boaz, parece que estás creando una subclase de NSTableView y luego haces que una instancia de esa subclase sea el delegado de NSTableView. Si va a una subclase, esa subclase debe usarse en lugar de NSTableView, no además de ella. Además, casi siempre es una violación de las preocupaciones tener una vista como delegado de otro objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top