Pregunta

Tengo un NSTableView y un NSOutlineView, ambos con su contenido proporcionado por enlaces, que me gustaría tener alguna funcionalidad de arrastrar y soltar:

  • Arrastre las filas de la Tabla A a una fila del Esquema B, donde se copiarán en una estructura de datos que representa la fila en el Esquema B.

  • Arrastre una fila del Esquema B a otra fila en el Esquema B, que copiará los datos representados por la primera fila en los datos representados en la segunda fila.

He leído la documentación de arrastrar y soltar de Apple y no llegué a ninguna parte. Realmente no parece aplicarse a lo que necesito hacer. ¿Qué me estoy perdiendo?

¿Fue útil?

Solución

Necesita una fuente de datos & # 8212; AFAIK, no puede hacer que esto suceda solo con Bindings.

El Adium Xtras Creator inacabado, que está bajo la licencia BSD, incluye un controlador de matriz que puede establecer como la fuente de datos para arrastrar y soltar en una vista de tabla basada en enlaces .

Este requisito puede no aplicarse a NSOutlineView y NSTreeController. No lo he intentado.

Otros consejos

La página a la que se vinculó es bastante clara sobre lo que debe hacer. En la fuente de datos de la tabla A, implemente registerForDraggedTypes: y tableView: writeRowsWithIndexes: toPasteboard: para poner algunos datos privados de TableAPasteboardType en el cartón.

En la fuente de datos del esquema B, implemente los mismos dos métodos y coloque algunos datos privados de OutlineBPasteboardType en el cartón.

Finalmente, implemente tableView: validateDrop :posedRow: propuestoDropOperation: y tableView: acceptDrop: row: dropOperation: para verificar el tablero para TableAPasteboardType o OutlineBPasteboardType y realice los cambios apropiados en su modelo encuadernado, dependiendo.

Es bastante sencillo una vez que simplemente interviene y lo hace.

En MacOS 10.7 se agregaron algunos protocolos nuevos para implementar esto.

Hay una falta de documentación para las tablas en este momento, pero puedes encontrar algunos buenos ejemplos:

Para NSTableViwew, el protocolo NSTableViewDataSource define los siguientes métodos:

  • (BOOL)tableView:writeRowsWithIndexes:toPasteboard:
  • tableView:validateDrop:proposedRow:proposedDropOperation:
  • tableView:acceptDrop:row:dropOperation:

Para NSOutlineView, el protocolo NSOutlineViewDataSource define los siguientes métodos:

  • (BOOL)outlineView:writeItems:toPasteboard:
  • (NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
  • (BOOL)outlineView:acceptDrop:item:childIndex:

Estos son los requisitos mínimos para implementar para cada tipo de vista. Los casos de uso son bastante similares.

  1. Si el método toPasteboard: devuelve SÍ, se inicia el arrastre.
  2. El método validateDrop: controla qué nodo objetivo está permitido al actualizar el marcador en la vista
  3. Devuelve SÍ para el método acceptDrop: si la caída fue exitosa

Esto conduce a dos casos de subutilización que debe administrar. El primero es un drag & amp; caer dentro de la misma vista o la misma operación entre dos vistas. Además, puede distinguir entre mover, copiar o eliminar operaciones. Un buen ejemplo es cómo funcionan los puntos de interrupción con drag & amp; colocar en Xcode.

tableView tiene algunos métodos adicionales para personalizar drag & amp; caer, pero los que mencioné son los métodos clave para que funcione.

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