Trascinamento selezione di NSTableView e NSOutlineView
-
19-08-2019 - |
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?
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.
- Se il metodo toPasteboard: restituisce SÌ, il trascinamento viene avviato.
- validateDrop: il metodo controlla quale nodo target è consentito aggiornando il marker nella vista
- 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.