Обновление и сохранение данных в plist
Я делаю игру для iOS и мне нужно сохранить наивысший уровень, которого достиг игрок. Я могу успешно изменить элемент данных в списке, но по какой-то причине эти данные возвращаются к своему первоначальному значению при каждом перезапуске игры. Вот основной поток моего кода:
В инициации игры получите самый высокий уровень, которого достиг игрок (исходное значение равно 1).
pData = [[PlayerData alloc] init];
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
[self startNewLevel:currentLevel];
& APOS; данные & APOS; NSMutableDictionary, который инициализируется следующим образом в PlayerData:
self.data = [NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"playerdata" ofType:@"plist"]];
позже, если игрок побеждает самый высокий уровень, я увеличиваю «самый высокий уровень». значение и запись в файл, вызывая эту функцию в PlayerData:
-(void) newHighestLevel:(NSString*)path :(int)level{
[self.data setValue:[NSNumber numberWithInt:level] forKey:path];
[self.data writeToFile:@"playerdata.plist" atomically:YES]
Я знаю, что все это работает, потому что у меня есть меню уровней, к которому игрок может получить доступ во время игры. Каждый раз, когда игрок нажимает кнопку меню уровня, создается подкласс UITableView, который отображает уровень от 1 до самого высокого достигнутого уровня. Инициализация выглядит так:
levelMenu = [[LevelMenu alloc] init:[[pData.data valueForKey:@"Highest Level"] intValue]];
Меню уровней отображает правильное количество уровней во время игры (например, если игрок не прошел ни одного уровня и переходит в меню уровней, оно просто отображает «уровень 1»; но если игрок бьет уровень 1 и переходит к в меню уровня отображаются «уровень 1» и «уровень 2»). Однако всякий раз, когда приложение закрывается или пользователь выходит из главного меню игр, значение «самый высокий уровень» возвращается к 1 и этот код:
currentLevel = [[pData.data valueForKey:@"Highest Level"] intValue];
всегда устанавливает currentLevel на 1, когда игрок запускает старт, независимо от того, сколько уровней пользователь пробил во время игры.
Почему значение меняется обратно? Я пропускаю что-то, что сделало бы мои правки списков постоянными?
РЕДАКТИРОВАТЬ:
вот мой новый 'newHighestLevel & apos; метод:
-(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 устанавливается в YES. Если я изменю «docfilePath» на @ & quot; playerdata.plist & quot ;, ему присваивается значение NO. Кажется, ничего не меняется с игрой в любом случае.
РЕШЕНИЕ:
-(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];
}
и в 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;
}