Проблема NSUserDefaults

У меня есть этот метод applicationDidFinishLaunching делегата моего приложения:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"AcceptTC"] == nil){
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AcceptTC"];
    [defaults registerDefaults:appDefaults];
}

и у меня это есть в моем методе RootViewController viewDidLoad:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if(![defaults boolForKey:@"AcceptTC"]){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notice" message:@"By using this application you agree to be bound by the Terms and Conditions as stated within this application." delegate:self cancelButtonTitle:@"No Deal" otherButtonTitles:@"I Understand",nil];
    [alert show];
    [alert release];
}

и мой делегат оповещения делает это:

if(buttonIndex == 0){
            exit(0);
        }
        else{
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:@"YES" forKey:@"AcceptTC"];
        }

Однако, когда я нажимаю «Я понимаю» (номер кнопки 1), а затем перезапускаю приложение, я все еще вижу окно предупреждения! Хотя я определенно установил значение ДА.

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

Спасибо


person Thomas Clayson    schedule 21.09.2010    source источник


Ответы (3)


Принимая registerDefaults:

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

// Load default defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary \
    dictionaryWithContentsOfFile:[[NSBundle mainBundle] \ 
    pathForResource:@"Defaults" ofType:@"plist"]]];

Код взят из этого SO-ответа .

Еще одна статья в блоге о NSDefaults:

person miku    schedule 21.09.2010
comment
верно ... но я не хочу устанавливать значения по умолчанию при каждой загрузке приложения. Я хочу установить значение по умолчанию на НЕТ, а затем никогда не устанавливать его снова, если пользователь не щелкнет Я понимаю, а затем я хочу установить его на ДА и оставить его навсегда - как настройки. Вы не вводите данные для входа в facebook КАЖДЫЙ РАЗ, когда открываете приложение? Или вам не нужно сбрасывать настройки каждый раз, когда вы открываете другое приложение? - person Thomas Clayson; 21.09.2010
comment
Хорошо, вы пробовали что-то вроде [[NSUserDefaults standardUserDefaults] synchronize]; - person miku; 21.09.2010
comment
отсутствовала синхронизация ..: p не понимал, что я должен был это сделать! Спасибо. :) - person Thomas Clayson; 21.09.2010

В моем приложении я использую NSUserDefaults с bool, отлично работает.

Когда загрузится первый ViewController, он сделает:

BOOL terms = [[NSUserDefaults standardUserDefaults] boolForKey:@"termsaccepted"];

if (!terms) {
   [self presentModalViewController:disclaimerViewController animated:YES];
}

В представлении заявления об отказе от ответственности после нажатия кнопки:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"termsaccepted"];
[[NSUserDefaults standardUserDefaults] synchronize];

Я думаю, вам не хватает части "синхронизировать". Однако я также считаю, что использование bool более рационально.

person Toastor    schedule 21.09.2010
comment
отсутствовала синхронизация ..: p не понимал, что я должен был это сделать! Спасибо. :) - person Thomas Clayson; 21.09.2010

Может быть, вам нужно вызвать синхронизацию по умолчанию, чтобы сохранить изменения на диск?

person zoul    schedule 21.09.2010
comment
отсутствовала синхронизация ..: p не понимал, что я должен был это сделать! Спасибо. :) - person Thomas Clayson; 21.09.2010