Aktualizowanie i zapisywanie danych w plist
Tworzę grę na iOS i muszę zapisać najwyższy poziom osiągnięty przez gracza. Mogę z powodzeniem zmienić element danych w plist, ale z jakiegoś powodu dane te powracają do swojej pierwotnej wartości przy każdym ponownym uruchomieniu gry. Oto podstawowy przepływ mojego kodu:
W init gry zdobądź najwyższy poziom osiągnięty przez gracza (oryginalna wartość to 1)
pData = [[PlayerData alloc] init];
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
[self startNewLevel:currentLevel];
„dane” to NSMutableDictionary, który jest inicjowany w ten sposób w PlayerData:
self.data = [NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"]];
później, jeśli gracz pokonuje najwyższy poziom, zwiększam wartość „najwyższego poziomu” i zapisuję do pliku, wywołując tę funkcję w PlayerData:
-(void) newHighestLevel:(NSString*)path :(int)level{
[self.data setValue:[NSNumber numberWithInt:level] forKey:path];
[self.data writeToFile:@"playerdata.plist" atomically:YES]
Wiem, że to wszystko działa, ponieważ mam menu poziomu, do którego gracz może uzyskać dostęp podczas gry. Za każdym razem, gdy gracz naciska przycisk menu poziomu, tworzona jest podklasa UITableView, która wyświetla poziom 1 przez najwyższy osiągnięty poziom. Inicjalizacja wygląda tak:
levelMenu = [[LevelMenu alloc] init:[[pData.data valueForKey:@"Highest Level"] intValue]];
Menu poziomu wyświetla prawidłową liczbę poziomów podczas gry (np. Jeśli gracz nie pokonał żadnego poziomu i przejdzie do menu poziomu, po prostu wyświetla „poziom 1”, ale jeśli gracz pokonuje poziom 1 i idzie do poziom menu, wyświetla „poziom 1” i „poziom 2”). Jednak za każdym razem, gdy aplikacja zostanie zakończona lub użytkownik zamknie menu główne gry, wartość „najwyższego poziomu” powraca do 1 i ten kod:
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
zawsze ustawia currentLevel na 1, gdy gracz naciska start, niezależnie od tego, ile poziomów pokonał użytkownik podczas gry.
Dlaczego wartość zmienia się z powrotem? Czy brakuje mi czegoś, co uczyniłoby moje edycje plist trwałymi?
EDYTOWAĆ:
oto moja nowa metoda „newHighestLevel”:
-(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];
}
zapis zostanie ustawiony na TAK. Jeśli zmienię 'docfilePath' na @ "playerdata.plist", zostanie ustawiony na NIE. W obu przypadkach nic nie zmienia się wraz z grą.
ROZWIĄZANIE:
-(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];
}
i 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;
}