Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Speichern mit NSKeyedArchiver

Bevor eine Anwendung ihre Daten schreibt, ist es gute Sitte den Anwender zu fragen, wohin er die Datei denn speichern möchte. Diese Abfrage können Sie ohne weiteres vornehmen, indem Sie sich des NSSavePanels bedienen. Dies ist das Standardfenster, das Sie bestimmt aus vielen anderen Cocoa-Anwendungen kennen.

Erweitern Sie MyController zunächst um zwei weitere Methoden und verbinden Sie die Action mit Menü, das von Xcode für jede Cocoa-Anwendung erstellt wird, und das Sie ebenfalls im Interface Builder finden.
- (IBAction)saveCharacter:(id)sender;
- (
IBAction)loadCharacter:(id)sender;
Sie können eigene Menüpunkte hinzufügen oder die Bestehenden umbenennen.
stacks_image_B3782C50-042D-4D2D-9C05-562799524D84
Auch die Umsetzung eines NSSavePanel sollte keine Schwierigkeiten darstellen. Im folgenden Code wird für die zu speichernde Datei kurzerhand der Filetyp crpg erzeugt. Das ist aber nur eine Dateiendung und hat keine Auswirkungen auf die Daten.
- (IBAction)saveCharacter:(id)sender
{
    NSSavePanel *aSavePanel = [NSSavePanel savePanel];
    [aSavePanel setRequiredFileType:@"crpg"];
    [aSavePanel setTitle:@"Character speichern"];
    [aSavePanel setPrompt:@"Speichern"];

    if ([aSavePanel runModal] == NSOKButton)
    {
        // Speichern
    }
}
Das eigentliche Speichern ist dann nur noch eine einzige Anweisung. Ein NSKeyedArchiver übernimmt die ganze Arbeit, nachdem die Klasse Character richtig vorbereitet wurde.
if ([aSavePanel runModal] == NSOKButton)
{
    NSString *filename = [aSavePanel filename];
    BOOL result = [NSKeyedArchiver archiveRootObject:rpgCharacter toFile:filename];

    if (result == FALSE)
    {
        NSLog(@"Ein Fehler ist aufgetreten");
    }
}
stacks_image_B31A50E2-EF80-4F0C-BC97-068F9E156A38