Verwenden eines NSArrayControllers in mehreren Storyboard-Szenen

8

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?

    
Mark Szymczyk 05.11.2014, 01:17
quelle

1 Antwort

14

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):

%Vor%

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: Ссылка

    
Aaron Wright 27.04.2015, 19:46
quelle