Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Binden der Rasse

Ist das Array mit den passenden Rassen gefüllt, soll es auch wieder per Binding mit einem Steuerelement verbunden werden. Da es sich um ein Array handelt, ist der Controller dafür ein NSArrayController. Sie finden Ihn wieder in der Palette der Steuerelemente. Diesen Controller sollten Sie in Races Controller umbenennen.
stacks_image_D470F775-966C-4932-BF26-A7BC60117703
Auch dieser Controller muss noch konfiguriert werden. Ändern Sie in den Attributen den Class Name auf Race und fügen Sie als Key racename hinzu. Wie Sie sich sicher erinnern, ist dies die einzige Eigenschaft der Klasse Race.
stacks_image_B394B5FF-920E-4930-8002-58D15365065B
Da auch dieser Controller seinen Inhalt aus dem MyController bezieht, muss das Binding genau wie zuvor beim Character Controller gemacht werden. Mit dem Unterschied, dass der angebundene Key jetzt racesArray ist
stacks_image_0F0C53C2-CED5-4545-8213-B1B5CFD0D808
Jetzt wird auch klar, warum man für die Rassen eine eigene Klasse erstellen musste und nicht einfach nur eine Reihe von NSString Objekten verwendet hat. So ein Array wäre nicht Key-Value-Coding konform, da man den Inhalt der Zeichenkette nicht über einen Namen abfragen könnte. Erst durch den Key racename, der ein Feld in einer Klasse beschreibt, ist Binding mit KVC möglich.

Nachdem der Controller vorbereitet ist, benötigen Sie als nächstes einen NSPopUpButton, der als Ziel des Binding dienen soll. Dieses Steuerelement gehört natürlich auf das Programmfenster.
stacks_image_4D5B8E3F-B7EF-4ABF-AB05-5E75905138B3
Gebunden wird dieses Steuerelement mit seinem Content an den Races Controller, und zwar an den Key racename. Dies hat zur Folge, dass die im NSPopUpButton verwendeten Objekte vom Typ NSString sind. Das wird später noch wichtig, wenn die Auswahl in rpgCharacter gespeichert werden soll.
stacks_image_AC56C27B-185E-454C-A26D-9DD8D624C9FD
Sobald man einen NSArrayController benutzt, ist dieser für die Verwaltung der Objekte zuständig. Das betrifft auch das Löschen und Hinzufügen von Objekten. Der Code in der determinePossibleRaces-Methode hintergeht aber den Controller, indem er direkt Manipulationen am Array vornimmt, von denen der Controller nichts weiss. Das ist nicht wirklich schlimm, hat aber den Effekt, dass der ArrayController von den Änderungen an den Daten nichts mitbekommt und sich demzufolge auch das Steuerelement nicht aktualisiert. Es ist nötig, den Controller über diese Änderungen zu informieren.

Für die Kommunikation mit dem NSArrayController ist ein Outlet im Code notwendig. Die Verbindungen dazu werden wie für alle Objekte im Interface Builder gezeichnet.
IBOutlet NSArrayController *myRacesController;
Wird in der determinePossibleRaces-Methode das racesArray komplett geleert und neu gefüllt, muss zum Schluss myRacesController über diese Änderungen informiert werden. Die Nachricht rearrangeObjects erledigt dies.
[myRacesController rearrangeObjects];
stacks_image_DE1445BE-10E3-46FF-99A8-E20A20889FDA