NSUserDefaults - сохранение данных для использования и повторного использования - стирание при каждом новом запуске? - PullRequest
0 голосов
/ 16 декабря 2011

Так что для моей игры я сохраняю значение "bool" того, разблокировал ли пользователь еще включение.Для этого я использую NSUserDefaults.Первоначально я следовал учебнику в Интернете о NSUserDefaults, поэтому позвольте мне поместить свой код и объяснить (весь следующий код находится в файле AppDelegate.m):

(ПРИМЕЧАНИЕ: «save» - это макрос для: [NSUserDefaults standardUserDefaults])

powerups = [[NSMutableArray alloc] init];
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"dateKey"] == nil) {
    NSDictionary *appDefaults  = [NSDictionary dictionaryWithObjectsAndKeys:[NSDate date], @"dateKey", nil];
    [save setBool:NO forKey:POWER_1];
    [save setBool:NO forKey:POWER_2];
    [save setBool:NO forKey:POWER_3];
    [save setBool:NO forKey:POWER_4];
    [save setBool:NO forKey:POWER_5];
    [save setBool:NO forKey:POWER_6];
    [save setBool:NO forKey:POWER_7];
    [save setBool:NO forKey:POWER_8];
    [save setBool:NO forKey:POWER_9];

    [save setInteger:0 forKey:@"1HighScore"];
    [save setInteger:0 forKey:@"2HighScore"];
    [save setInteger:0 forKey:@"3HighScore"];
    [save setInteger:0 forKey:@"CumulativeScore"];

    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"firstrun");
}

Итак, в приведенном выше коде я создаю массив, который можно вызывать из любого класса в моей игре, в котором хранятся все доступные бонусы.Этот оператор «if» следует вызывать только в том случае, если игра проводится впервые, поскольку он создает все значения данных в NSUserDefaults.ПРИМЕЧАНИЕ. Я использую взломанный iPhone и проверил созданный файл .plist.Кажется, не существует никакого значения, которое называется / со значением «dateKey».В учебнике сказано, что это способ проверить, является ли это первый запуск, потому что если значение даты не существует, то это первый запуск и т. Д. Логически это имело смысл.

Теперь следующий код, заполняет массив с учетом того, что NSUserDefaults ДОЛЖЕН существовать, независимо от того, был ли он просто «заполнен» или сохранен ранее:

if([save boolForKey:POWER_1])
    [powerups addObject:POWER_1];
if([save boolForKey:POWER_2])
    [powerups addObject:POWER_2];
if([save boolForKey:POWER_3])
    [powerups addObject:POWER_3];
if([save boolForKey:POWER_4])
    [powerups addObject:POWER_4];
if([save boolForKey:POWER_5])
    [powerups addObject:POWER_5];
if([save boolForKey:POWER_6])
    [powerups addObject:POWER_6];
if([save boolForKey:POWER_7])
    [powerups addObject:POWER_7];
/*if([save boolForKey:POWER_8])
 [powerups addObject:POWER_8];*/
if([save boolForKey:POWER_9])
    [powerups addObject:POWER_9];

Теперь кажется, что при КАЖДОМ новом запуске первый оператор «if»ДА, и все значения сбрасываются в соответствии с этим первым блоком кода ... который затем заставляет второй блок кода действовать соответствующим образом и не заполнять массив, потому что все было сброшено ...

Можетэто как-то связано с registerDefaults, нужно ли вообще звонить или использовать, потому что я почти уверен, что это проблема?

Спасибо всем, надеюсь, я понял:)

rnc505

1 Ответ

1 голос
/ 16 декабря 2011

Проблема в том, что registerDefaults не записана на диск в соответствии с Apple Docs

Содержимое регистрационного домена не записывается на диск; вы необходимо вызывать этот метод при каждом запуске приложения.

У вас есть 2 варианта, 1) не использовать registerDefaults и сохранить вашу «дату», как это

[save setObject:[NSDate date] forKey:@"dateKey"];

Это приведет к его записи на диск, и ваш код будет работать.

Более надежный способ - записать все ваши бонусы в registerDefaults и покончить с датой. Чтобы убедиться, что registerDefaults вызывается прежде, чем что-либо еще, поместите его в метод инициализации вашего appDelegate, например:

+ (void)initialize {
    NSMutableDictionary *defs = [NSMutableDictionary dictionary];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_!];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_2];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_3];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_4];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_5];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_6];
    [defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_7];
    [[NSUserDefaults standardUserDefaults] registerDefaults:defs];
}
...