Ich habe eine auf Mac-Dokumenten basierende Core Data-Anwendung, die Storyboards verwendet. Das Storyboard hat das folgende Layout:
%Vor%Mein Kerndatenmodell enthält eine Kapiteleinheit, die zwei Attribute enthält: Titel und Inhalt. Ich möchte, dass die Tabellenansicht jeden Kapiteltitel anzeigt. Die Textansicht zeigt den Inhalt des ausgewählten Kapitels.
Wenn ich eine XIB-Datei verwenden würde, würde ich der xib-Datei einen Array-Controller hinzufügen. Ich würde den Array-Controller an den Eigentümer der Datei binden, um auf meine NSPersistentDocument-Unterklasse zuzugreifen. Ich würde die Tabellenansicht an die Eigenschaft arrangedObjects des Array-Controllers binden und die Textansicht an die Auswahl des Array-Controllers binden.
Aber mit Storyboards werden die Dinge komplizierter. Ich kann dem Tabellenansicht-Controller einen Array-Controller hinzufügen, die Tabellenansicht an den Array-Controller binden und die Kapitelüberschriften in der Tabellenansicht anzeigen. Der Textansicht-Controller kann jedoch nicht an diesen Array-Controller binden, da sich der Array-Controller in einer anderen Szene befindet.
Wie füge ich einen Array-Controller in Interface Builder hinzu, so dass sowohl der Tabellenansicht-Controller als auch der Textansicht-Controller darauf zugreifen und sich daran binden können?
Der Schlüssel dafür ist, eine NSArrayController
-Instanz in jeder Ihrer absteigenden NSViewController
-Unterklassen zu haben und sie über eine zentrale Datenquelle (höchstwahrscheinlich Ihre NSDocument-Unterklasse) zu binden. Sie können diese Datenquelle dann als Ihre NSViewController
-Unterklasse representedObject
festlegen, indem Sie sie über Ihre absteigende Datei nach unten geben
Controller. Hier sehen Sie ein Beispiel für eine Storyboard-Anwendung mit NSWindowController
, die über einen Content-View-Controller verfügt, der ein NSSplitViewController
mit zwei untergeordneten View-Controllern ist (A Master / Detail-Setup):
Der Trick besteht darin, die representedObject
an jede der NSArrayController
des absteigenden View-Controllers im Storyboard zu binden. Sie müssen nicht nur die contentArray
binden, sondern auch die selectionIndexes
.
Das Ergebnis ist, dass selectionIndexes
auf beiden absteigenden NSArrayController
s synchron gehalten werden, weil sie durch die zentrale Datenquelle gebunden sind ( DataSource
subclass im obigen Beispiel).
Um das alles deutlicher zu machen, habe ich ein Beispielprojekt erstellt, das dies hier demonstriert: Ссылка
Tags und Links cocoa cocoa-bindings nsarraycontroller