Aktualisierung und Speicherung der Daten in plist

Ich mache ein iOS-Spiel und muss die höchste Stufe speichern, die der Spieler erreicht hat. Ich kann ein Datenelement in einer Liste erfolgreich ändern, aber aus irgendeinem Grund werden die Daten bei jedem Neustart des Spiels auf ihren ursprünglichen Wert zurückgesetzt. Hier ist der grundlegende Ablauf meines Codes:

Erreiche in der Init des Spiels das höchste Level, das der Spieler erreicht hat (der ursprüngliche Wert ist 1)

pData = [[PlayerData alloc] init];
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
[self startNewLevel:currentLevel];

'data' ist ein NSMutableDictionary, das in PlayerData folgendermaßen initialisiert wird:

self.data = [NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"]];

Wenn der Player später die höchste Stufe erreicht, erhöhe ich den Wert für die höchste Stufe und schreibe in die Datei, indem ich diese Funktion in PlayerData aufrufe:

-(void) newHighestLevel:(NSString*)path :(int)level{
     [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
     [self.data writeToFile:@"playerdata.plist" atomically:YES]

Ich weiß, dass das alles funktioniert, weil ich ein Level-Menü habe, auf das der Spieler während des Spiels zugreifen kann. Jedes Mal, wenn der Player die Level-Menü-Taste drückt, wird eine Unterklasse von UITableView erstellt, die Level 1 bis zum höchsten erreichten Level anzeigt. Die Initialisierung sieht folgendermaßen aus:

levelMenu = [[LevelMenu alloc] init:[[pData.data valueForKey:@"Highest Level"] intValue]];

Das Level-Menü zeigt während des Spiels die richtige Anzahl von Levels an (z. B. wenn der Spieler keine Levels geschlagen hat und zum Level-Menü geht, wird nur "Level 1" angezeigt; wenn der Spieler jedoch Level 1 geschlagen hat und zum geht) Level-Menü, es zeigt "Level 1" und "Level 2"). Wenn jedoch die App beendet wird oder der Benutzer das Hauptmenü des Spiels verlässt, wird der Wert für "höchste Ebene" auf 1 und diesen Code zurückgesetzt:

currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];

Setzt currentLevel immer auf 1, wenn der Spieler den Start drückt, unabhängig davon, wie viele Level der Benutzer während des Spiels geschlagen hat.

Warum ändert sich der Wert zurück? Fehlt mir etwas, das meine Plist-Änderungen dauerhaft macht?

BEARBEITEN:

Hier ist meine neue 'newHighestLevel'-Methode:

-(void) newHighestLevel:(NSString*)path :(int)level{
    [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
    [self.data writeToFile:docfilePath atomically:YES];
    self.data = [NSMutableDictionary dictionaryWithContentsOfFile:docfilePath];
    BOOL write = [self.data writeToFile:docfilePath atomically:YES];
}

write wird auf YES gesetzt. Wenn ich 'docfilePath' in @ "playerdata.plist" ändere, wird es auf NO gesetzt. In beiden Fällen scheint sich am Spiel nichts zu ändern.

LÖSUNG:

-(void) newHighestLevel:(NSString*)path :(int)level{
      [self.data setValue:[NSNumber numberWithInt:level] forKey:path];
      NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
      NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
      [self.data writeToFile:docfilePath atomically:YES];
}

und in init

-(id) init{

     NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     NSString *docfilePath = [basePath stringByAppendingPathComponent:@"playerdata.plist"];
     NSFileManager *fileManager = [NSFileManager defaultManager];
     if (![fileManager fileExistsAtPath:docfilePath]){
         NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"];
         [fileManager copyItemAtPath:sourcePath toPath:docfilePath error:nil];
     }
     self.data = [NSMutableDictionary dictionaryWithContentsOfFile:docfilePath];
     return self;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage