Ich habe eine NSTableView und eine NSOutlineView, beide mit ihrem Inhalt, der von Bindings bereitgestellt wird. Ich hätte gerne eine Drag-and-Drop-Funktionalität:
Ziehen Sie Zeilen aus Tabelle A auf eine Zeile von Gliederung B, wo sie in eine Datenstruktur kopiert werden, die die Zeile in Gliederung B darstellt.
Ziehen Sie eine Zeile von Gliederung B auf eine weitere Zeile in Gliederung B, die die Daten der ersten Zeile in die Daten der zweiten Zeile kopiert.
Ich habe Apples Drag-and-Drop-Dokumentation gelesen und verstanden nirgends. Es scheint nicht wirklich zu gelten, was ich tun muss. Was vermisse ich?
Sie benötigen eine Datenquelle - AFAIK, das können Sie nicht mit Bindings allein machen.
Der unfertige Adium Xtras Creator, der unter der BSD-Lizenz steht, enthält einen Array-Controller die Sie als Datenquelle festlegen können, um Drag-and-Drop in einer Bindings-powered-Tabellenansicht zu erhalten .
Diese Anforderung gilt möglicherweise nicht für NSOutlineView und NSTreeController. Ich habe das nicht versucht.
Die Seite, die Sie verlinkt haben, ist ziemlich klar, was Sie tun müssen. Implementieren Sie in der Datenquelle von Tabelle A registerForDraggedTypes:
und tableView:writeRowsWithIndexes:toPasteboard:
, um einige private TableAPasteboardType
-Daten auf der Montagefläche zu speichern.
Implementieren Sie in der Datenquelle von Gliederung B dieselben zwei Methoden, und fügen Sie einige private OutlineBPasteboardType
-Daten auf der Montagefläche hinzu.
Implementieren Sie schließlich tableView:validateDrop:proposedRow:proposedDropOperation:
und tableView:acceptDrop:row:dropOperation:
, um die Einfügefläche für TableAPasteboardType
oder OutlineBPasteboardType
zu überprüfen, und nehmen Sie die entsprechenden Änderungen an Ihrem gebundenen Modell vor.
Es ist ziemlich einfach, sobald du einfach reingehst und es tust.
In MacOS 10.7 wurden einige neue Protokolle hinzugefügt, um dies zu implementieren.
Es gibt eine fehlende Dokumentation für Tabellen im Moment, aber Sie können einige schöne Beispiele finden:
Für NSTableViwew definiert das Protokoll NSTableViewDataSource die folgenden Methoden:
(BOOL)tableView:writeRowsWithIndexes:toPasteboard:
tableView:validateDrop:proposedRow:proposedDropOperation:
tableView:acceptDrop:row:dropOperation:
Für NSOutlineView definiert das Protokoll NSOutlineViewDataSource die folgenden Methoden:
(BOOL)outlineView:writeItems:toPasteboard:
(NSDragOperation)outlineView:validateDrop:proposedItem:proposedChildIndex:
(BOOL)outlineView:acceptDrop:item:childIndex:
Dies sind die Mindestanforderungen, die für jeden Ansichtstyp implementiert werden müssen. Die Anwendungsfälle sind ziemlich ähnlich.
Dies führt zu zwei Unteranwendungen, die Sie verwalten müssen. Der erste ist ein Drag & amp; innerhalb derselben Sicht oder derselben Operation zwischen zwei Ansichten ablegen. Zusätzlich können Sie zwischen den Operationen verschieben, kopieren oder löschen unterscheiden. Ein schönes Beispiel ist, wie die Breakpoints mit Drag & amp funktionieren; Drop in Xcode.
Die TableView hat einige zusätzliche Methoden, um Drag & amp; fallen, aber die, die ich erwähnte, sind die Schlüsselmethoden, um es zum Funktionieren zu bringen.
Tags und Links cocoa nstableview drag-and-drop cocoa-bindings nsoutlineview