Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X 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_D4ACF28F-3064-4FAC-9953-46B6992357F8
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_DF66965A-8D39-4760-A707-F25C60E2E4CD
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_17B5F3BF-CC4A-4935-9B03-52A2064CC6B5
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_F1CE0227-F439-48C5-857F-77F7B11885AC
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_C4E1D097-98F5-489D-8569-01552CCEB1BA
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_8FA8B0C1-BA8A-49DB-9283-ABAEC1FA7A9E