Arrastrar y soltar archivos en un NSTableView?
-
03-07-2019 - |
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)
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.