0

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

(Примечание: «сохранить» макрос для: [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. ПРИМЕЧАНИЕ. Я использую jailbroken 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

+0

Тестируете это в тренажере или на устройстве? – LearnCocos2D

+0

Я тестирую его на обоих, но это происходит на устройстве. Кажется, я не могу проверить это на симуляторе, но, очевидно, устройство является самым важным. –

ответ

1

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

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

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

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

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

Более надежный способ - написать все свои бонусы для регистрацииDefaults и покончить с датой. Для того, чтобы гарантировать, что 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]; 
} 
+0

Так что это делается каждый раз, когда он начинается, называет этот метод. Тогда, если эти значения еще не существуют, это создает их, и если они уже выполняются, они игнорируются. Но как данные сохраняются? Через последующие вызовы '[save setObject: [OBJECT] forKey: [KEY]] и' [save sychronize] '? –

+0

Код в методе инициализации выше Регистры по умолчанию каждый раз, когда приложение запускается. Они используются, если в NSUserDefaults нет значения для этого ключа. Тогда всякий раз, когда пользователь получает Power, вы сохраните его на диске, вызывая '[[NSUserDefaults standardDefaults] setBool: YES forKey: POWER_4];' – agilityvision

+0

О, ладно спасибо :) Получил –