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

Da die ausgewählte Rasse zusammen mit den anderen Eigenschaften in einem Objekt verwaltet werden soll, ist es zunächst nötig, der Klasse Character eine weitere Instanzvariable hinzuzufügen. Die zugehörigen Accessor-Methoden dürfen natürlich auch nicht fehlen.
NSString *race;
Ausserdem sollten sie diese Eigenschaft als weiteren Key im Character Controller hinzufügen.

Auch diese Eigenschaft muss jetzt gebunden werden, und zwar ebenfalls an den NSPopUpButton. Der Content dieses Steuerelements kommt aus dem Races Controller, aber das ausgewählte Objekt muss an den Character Controller gebunden werden
stacks_image_45CDFAD6-508C-40D3-AC52-AE569FEBBA48
Diese Verbindung hat einige Nebenwirkungen. Würfelt man zum ersten Mal neue Werte aus und ermittelt dadurch auch die verfügbaren Rassen, zeigt der NSPopUpButton den Text No Value an. Zwar wurde das Array für den Races Controller gefüllt, der ausgewählte Wert, der aber mit einer Eigenschaft des Character Controller verbunden ist, wurde noch nicht festgelegt. Erst wenn in dem NSPopUpButton eine Auswahl getätigt wurde, verschwindet die Anzeige von No Value.
Dieser gewählt Wert bleibt aber auch nach einem erneuten Würfeln bestehen, selbst dann, wenn die zuvor gewählte Rasse gar nicht mehr zur Verfügung steht. Beiden Problemen kann man aber relativ leicht Herr werden, indem man nach dem Würfeln die Rasse auf einen Standardwert setzt. Da die Rasse Mensch immer möglich ist, bietet sie sich dafür an.

Ändern Sie die Anweisung
[racesArray addObject:[[Race alloc] initWithName:@"Mensch"]];
in die drei Anweisungen
Race *aRace = [[Race alloc] initWithName:@"Mensch"];
[racesArray addObject:aRace];
[rpgCharacter setRace:[aRace racename]];
Damit wird auch die Rasse in rpgCharacter auf einen Wert gesetzt. Der Benutzer kann ihn zwar im Nachhinein ändern, aber die Spielfigur ist nie ohne Rasse.

Damit ist das Binding der Rasse abgeschlossen. Mit der Methode testBinding können Sie die Werte testen.
- (IBAction)testBinding:(id)sender
{
    if ([myCharacterController commitEditing] == YES )
    {
        NSLog(
@"Name: %@", [rpgCharacter characterName] );
        NSLog(
@"Rasse: %@", [rpgCharacter race] );
        NSLog(
@"Stärke: %@", [rpgCharacter strength] );
    }
}
stacks_image_AEB17DA0-0EB4-4F33-9D8E-A88F968B0914