8

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

  • Drag filas de la Tabla A en 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 desde el Esquema B al 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 Apple's drag-and-drop documentation y he llegado a la nada. En realidad, no parece aplicarse a lo que tengo que hacer. ¿Qué me estoy perdiendo?

Respuesta

5

Necesita una fuente de datos-AFAIK, no puede hacer que esto suceda solo con Vinculaciones.

El inacabado Adium Xtras Creator, que está bajo la licencia BSD, incluye an array controller that you can set as the data source to get drag-and-drop in a Bindings-powered table view.

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

+0

El enlace termina como 404, y no puedo encontrar el código original en ninguna parte. –

+0

@ François Beausoleil: Gracias; He actualizado el enlace. –

+0

Esa forma perfectamente lógica y limpia de hacer esto. Gracias por volver a vincular –

7

La página a la que se ha vinculado 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 la mesa de trabajo.

En la fuente de datos del esquema B, implemente los mismos dos métodos y coloque algunos datos privados de OutlineBPasteboardType en la mesa de trabajo.

Por último, implementar tableView:validateDrop:proposedRow:proposedDropOperation: y tableView:acceptDrop:row:dropOperation: para comprobar la mesa de trabajo, ya sea para TableAPasteboardType o OutlineBPasteboardType y hacer los cambios apropiados a su modelo de cota, dependiendo.

Es bastante sencillo una vez que solo se abre y lo hace.

5

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

Hay una lack of documentation for tables en el momento pero se pueden encontrar algunos ejemplos bonito:

Para NSTableViwew 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 validateDrop: controles de métodos que tienen como objetivo nodo se permite mediante la actualización del marcador en la vista
  3. Volver SÍ para la acceptDrop: método si la caída fue exitosa

Esto condujo a dos sub-casos de uso que tiene administrar. El primero es un arrastrar & 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 arrastrar & soltar en Xcode.

TableView tiene algunos métodos adicionales para personalizar la función de arrastrar &, pero los que he mencionado son los métodos clave para que funcione.