Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Laden mit NSKeyedUnarchiver

Das Laden der Spielfigur ist im Gegensatz zum Speichern ein sehr komplexer Vorgang. Dabei liegt das Problem gar nicht im Laden der Daten selbst, sondern im Wiederherstellen der möglichen Klassen und Rassen. Die NSPopUpButton müssen gefüllt werden, bevor der Wert in rppCharacter gesetzt wird, da dieser ja auch an das ausgewählte Objekt gebunden ist. Um die möglichen Klassen und Rassen aber ermitteln zu können, müssen die Werte für Stärke und die anderen Zahlenwerte schon in rpgCharacter vorhanden sein. Man muss daher ein wenig aufpassen, in welcher Reihenfolge die Anweisungen aufgerufen werden.

Kümmern wir uns aber zunächst um etwas Einfaches, nämlich die Auswahl der zu ladenden Datei. Statt eines NSSavePanel verwenden Sie jetzt ein NSOpenPanel. Ansonsten ist die Syntax recht ähnlich.
- (IBAction)loadCharacter:(id)sender
{
    NSOpenPanel *aOpenPanel = [NSOpenPanel openPanel];
    [aOpenPanel setRequiredFileType:@"crpg"];
    [aOpenPanel setTitle:@"Character laden"];
    [aOpenPanel setPrompt:@"Laden"];

    if ([aOpenPanel runModal] == NSOKButton)
    {
Da das geladene Objekt aus den zuvor erwähnten Gründen nicht einfach auf rpgCharacter geschrieben werden kann, bedienen wir uns eines neues Objektes, um die Werte aufzunehmen.
        NSString *filename = [aOpenPanel filename];
        Character *aCharacter = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];

Als nächstes können alle Zahlenwerte, sowie Bild und Name der Spielfigur, von aCharacter zu rpgCharacter übernommen werden.
        [rpgCharacter setCharacterName:[aCharacter characterName]];
        [rpgCharacter setImage:[aCharacter image]];

        [rpgCharacter setStrength:[aCharacter strength]];
        [rpgCharacter setDexterity:[aCharacter dexterity]];
        [rpgCharacter setConstitution:[aCharacter constitution]];
        [rpgCharacter setIntelligence:[aCharacter intelligence]];
        [rpgCharacter setWisdom:[aCharacter wisdom]];
        [rpgCharacter setCharisma:[aCharacter charisma]];
Sind diese Werte übertragen, kann man die Methoden zur Ermittlung von Rasse und Klasse aufrufen und anschiessend auch diese Eigenschaften der Spielfigur übernehmen.
        [self determinePossibleRaces];
        [self determinePossibleClasses];

        [rpgCharacter setRace:[aCharacter race]];   
        [rpgCharacter setCharClass:[aCharacter charClass]];
    }
}
Damit ist die Spielfigur geladen und auch das Programmfenster sollte sich mit allen Werten aktualisiert haben.

nächste Seite