Domanda

Ho un NSTableView e un NSOutlineView, entrambi con il loro contenuto fornito dai bind, che mi piacerebbe avere alcune funzionalità di trascinamento della selezione:

  • Trascina le righe dalla tabella A su una riga del contorno B, dove verranno copiate in una struttura di dati rappresentata dalla riga nel contorno B.

  • Trascina una riga dallo schema B su un'altra riga nello schema B, che copierà i dati rappresentati dalla prima riga nei dati rappresentati nella seconda riga.

Ho letto la documentazione di trascinamento della selezione di Apple e ottenuto praticamente da nessuna parte. Non sembra davvero applicarsi a ciò che devo fare. Cosa mi sto perdendo?

È stato utile?

Soluzione

Hai bisogno di un'origine dati & # 8212; AFAIK, non puoi farlo accadere con i Bindings da solo.

Il creatore incompleto di Adium Xtras, che è sotto licenza BSD, include un controller di array che puoi impostare come origine dati per ottenere il trascinamento della selezione in una vista della tabella basata su Bindings .

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

Altri suggerimenti

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

Nell'origine dati della struttura B, implementare gli stessi due metodi e inserire alcuni dati OutlineBPasteboardType privati ??sul pannello di montaggio.

Infine, implementa tableView: validateDrop: proposRow: proposDropOperation: e tableView: acceptDrop: row: dropOperation: per controllare il pasteboard per TableAPasteboardType o OutlineBPasteboardType e apporta le modifiche appropriate al tuo modello associato, a seconda.

È abbastanza semplice una volta che ti limiti a farlo.

In MacOS 10.7 sono stati aggiunti alcuni nuovi protocolli per implementarlo.

C'è una mancanza di al momento, ma puoi trovare alcuni esempi interessanti:

Per NSTableViwew il protocollo NSTableViewDataSource definisce i seguenti metodi:

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

Per NSOutlineView il protocollo NSOutlineViewDataSource definisce i seguenti metodi:

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

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

  1. Se il metodo toPasteboard: restituisce SÌ, il trascinamento viene avviato.
  2. validateDrop: il metodo controlla quale nodo target è consentito aggiornando il marker nella vista
  3. Restituisce SÌ per acceptDrop: metodo se il drop ha avuto esito positivo

Questo porta a due sotto-casi d'uso che devi gestire. Il primo è un drag & amp; cadere all'interno della stessa vista o della stessa operazione tra due viste. Inoltre, è possibile distinguere tra le operazioni di spostamento, copia o eliminazione. Un bell'esempio è come funzionano i punti di interruzione con drag & amp; inserire Xcode.

tableView ha alcuni metodi aggiuntivi per personalizzare il drag & amp; drop, ma quelli che ho citato sono i metodi chiave per farlo funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top