Frage

Ich habe ein NSTableView und ein NSOutlineView, beide mit ihrem Inhalt von Bindungen zur Verfügung gestellt, dass ich etwas haben möchte Drag-and-Drop-Funktionalität:

  • Ziehen Zeilen aus Tabelle A auf Eine Reihe des Umriss B, wo sie in eine Datenstruktur kopiert werden, die die Zeile in der Gliederungs B darstellt.

  • Ziehen Sie eine Reihe von Umrisse B auf andere Zeilen in den Gliederungs B, der die Daten von der ersten Zeile in die dargestellten Daten in der zweiten Zeile dargestellt kopiert.

Ich habe gelesen Apples Drag-and-Drop-Dokumentation und fast nirgends bekommen. Es ist nicht wirklich zu gelten scheinen, was ich tun muss. Was bin ich?

War es hilfreich?

Lösung

Sie müssen eine Datenquelle-AFAIK, können Sie das nicht allein mit Bindungen geschehen.

Der unvollendete Adium Xtras Creator, die unter der BSD-Lizenz ist, enthält ein Array-Controller, die Sie als Datenquelle einstellen können per Drag-and-Drop in einem Bindings betriebenen Tabellenansicht zu erhalten.

Diese Anforderung kann auf NSOutlineView und NSTreeController keine Anwendung. Ich habe das nicht versucht.

Andere Tipps

Die Seite, die Sie verknüpft ist ziemlich klar, was Sie tun müssen. In Tabelle A der Datenquelle, implementieren registerForDraggedTypes: und tableView:writeRowsWithIndexes:toPasteboard: einige private TableAPasteboardType Daten über die Zwischenablage zu stellen.

In Umriss B Datenquelle, implementieren die beiden gleichen Methoden und setzen einige private OutlineBPasteboardType Daten auf der Montagefläche.

Schließlich implementieren tableView:validateDrop:proposedRow:proposedDropOperation: und tableView:acceptDrop:row:dropOperation: die Pappe zu prüfen, entweder TableAPasteboardType oder OutlineBPasteboardType und die entsprechenden Änderungen an Ihrem gebundenes Modell machen, je nachdem.

Es ist ziemlich einfach, wenn Sie nur in pflügen und es tun.

In MacOS 10.7 einige neue Protokolle wurden hinzugefügt, dies umzusetzen.

Es gibt eine Mangel an Dokumentation für Tabellen im Moment, aber Sie können einige schöne Beispiele finden:

Für NSTableViwew das Protokoll NSTableViewDataSource definiert die folgenden Methoden:

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

Für NSOutlineView das Protokoll NSOutlineViewDataSource definiert die folgenden Methoden:

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

Dies sind die Mindestanforderungen für jede Ansicht Typ zu implementieren. Die Anwendungsfälle sind recht ähnlich.

  1. Wenn die toPasteboard. Methode gibt JA, das Drag gestartet
  2. Die validateDrop: Verfahren steuert, den Zielknoten durch die Aktualisierung des Markers in der Ansicht erlaubt ist
  3. Zurück JA für die acceptDrop: Methode, wenn der Tropfen war erfolgreich

Dies führte zu zwei Unter usecases müssen Sie verwalten. Die erste ist eine Drag & Drop in der gleichen Ansicht oder die gleiche Operation zwischen zwei Ansichten. Zusätzlich können Sie zwischen Bewegung unterscheiden, kopieren oder Operationen löschen. Ein schönes Beispiel dafür ist, wie die Haltepunkte mit Drag & Drop in Xcode arbeiten.

Der Tableview hat einige zusätzliche Methoden Drag & Drop anpassen, aber die, die ich bereits erwähnt sind die wichtigsten Methoden, um es zum Laufen zu bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top