8

Ho un NSTableView e un NSOutlineView, entrambi con il loro contenuto fornito da attacchi, che mi piacerebbe avere alcune funzionalità di drag-and-drop:NSTableView e NSOutlineView drag-and-drop

  • trascinamento righe dalla Tabella A su una riga di Struttura B, in cui verranno copiati in una struttura dati che rappresenta la riga in B di contorno.

  • trascina una riga da Schema B su un'altra riga in Schema B, che copiare i dati rappresentati dalla prima riga nei dati rappresentati nella seconda riga.

Ho letto Apple's drag-and-drop documentation e ottenuto praticamente da nessuna parte. Non sembra proprio applicarsi a ciò che devo fare. Cosa mi manca?

risposta

5

È necessaria un'origine dati, AFAIK, non è possibile farlo accadere con Bindings.

L'incompiuto Adium Xtras Creator, che è sotto la licenza BSD, include an array controller that you can set as the data source to get drag-and-drop in a Bindings-powered table view.

Questo requisito potrebbe non essere applicabile a NSOutlineView e NSTreeController. Non l'ho provato

+0

Il collegamento termina come 404 e non riesco a trovare il codice originale da nessuna parte. –

+0

@ François Beausoleil: Grazie; Ho aggiornato il collegamento. –

+0

Un modo perfettamente logico e pulito per farlo. Grazie per ricollegare. –

7

La pagina a cui sei collegato è abbastanza chiara su ciò che devi fare. Nell'origine dati della tabella A, implementare registerForDraggedTypes: e tableView:writeRowsWithIndexes:toPasteboard: per inserire alcuni dati privati ​​TableAPasteboardType sul tavolo di montaggio.

Nell'origine dati di B, implementare gli stessi due metodi e inserire alcuni dati privati ​​OutlineBPasteboardType nel cartone.

Infine, implementare e tableView:validateDrop:proposedRow:proposedDropOperation:tableView:acceptDrop:row:dropOperation: per controllare il tavolo di montaggio sia per TableAPasteboardType o OutlineBPasteboardType e apportare le modifiche necessarie al modello vincolato, a seconda.

È piuttosto semplice una volta che si arraffa e si fa.

5

In MacOS 10.7 sono stati aggiunti alcuni nuovi protocolli per implementare questo.

C'è un lack of documentation for tables al momento, ma si possono trovare alcuni esempi curato:

Per NSTableViwew del protocollo NSTableViewDataSource definisce i seguenti metodi:

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

Per NSOutlineView protocollo NSOutlineViewDataSource definisce i seguenti metodi:

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

Questi sono i requisiti minimi da implementare per ciascun tipo di vista. I casi d'uso sono abbastanza simili.

  1. Se il toPasteboard: metodo restituisce SÌ, viene avviato il trascinamento.
  2. Il validateDrop: controlli metodo che prendono di mira il nodo è consentito aggiornando il marcatore nella vista
  3. ritorno SI per l'acceptDrop: metodo se il calo è stato di successo

Questo ha portato a due sotto-casi d'uso che hai gestire. Il primo è un trascinamento & rilasciato all'interno della stessa vista o la stessa operazione tra due viste. Inoltre è possibile distinguere tra operazioni di spostamento, copia o cancellazione. Un bell'esempio è come funzionano i punti di interruzione con il trascinamento della caduta di Xin Xcode.

Il TableView ha alcuni metodi aggiuntivi per personalizzare il trascinamento dello spostamento &, ma quelli che ho citato sono i metodi chiave per farlo funzionare.

Problemi correlati