NSTableView und NSOutlineView ziehen und ablegen

8

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?

    
Rich Catalano 16.03.2009, 05:29
quelle

3 Antworten

5

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.

    
Peter Hosey 16.03.2009, 06:34
quelle
7

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.

    
Jim Puls 16.03.2009 06:25
quelle
4

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.

  1. Wenn die Methode toPasteboard: YES zurückgibt, wird der Ziehvorgang gestartet.
  2. Die validateDrop: -Methode steuert, welcher Zielknoten erlaubt ist, indem der Marker in der Sicht
  3. aktualisiert wird
  4. Geben Sie YES für die Methode acceptDrop: zurück, wenn die Löschung erfolgreich war

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.

    
Stephan 01.09.2012 07:19
quelle