Подтвердить что ты не робот

Iphone dev - проверка NSUserDefaults для булевого существования

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

Однако мой код просто захватывается, если ответ НЕТ, или они не были установлены. Мне нужно выяснить, установлены ли они, ТОГДА задают ответы!

код установки:

BOOL playSound;
BOOL playVibrate;


//test for some defaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (![prefs boolForKey:@"pref_sound"]) {
    playSound = YES;
    playVibrate = YES; 
} else {
    playSound = [prefs boolForKey:@"pref_sound"];
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
}


if (playSound) {
//do stuff
}

проблема заключается в том, что если пользователь устанавливает настройки в "НЕТ", тогда код изменяет и звук вибрации И на "Да", который предназначен для захвата для настройки NOT.

любые идеи?

4b9b3361

Ответ 1

Прежде всего, у вас есть ошибка в условном выражении if. Вы проверяете логическое значение, которое, согласно boolForKey: документации, вернет NO, если оно еще не установлено. Таким образом, boolForKey: - неправильный способ сделать это.

Вот две другие идеи.

Рассмотрите возможность использования другой настройки с другим ключом, чтобы указать, были ли инициализированы ваши настройки. Проверьте это при запуске приложения или когда вы впервые прочитали настройку. При необходимости инициализируйте. Например:

- (void) initializeUserDefaults {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (nil == [defaults objectForKey:@"initialized_defaults"]) {
        [defaults setBool:YES forKey:@"pref_sound"];
        [defaults setBool:YES forKey:@"pref_vibrate"];
        [defaults setObject:@"dummy_value" forKey:@"initialized_defaults"];
    }
}

Более простое решение (но я не уверен, что это сработает) было бы изменить ваше условное выражение:

if (![prefs objectForKey:@"pref_sound"]) {

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

Если вы добавляете новый параметр в новую версию своего приложения, вы не хотите, чтобы ваши новые настройки были неинициализированы, и вы не хотите останавливать существующие настройки ваших пользователей. Этот второй метод делает это без усилий, и в первом методе легче ввернуть. Но первый метод также собирает все ваши настройки в одном месте, чтобы вы могли видеть, как он должен работать, что мне нравится.

Я не уверен, что ADC docs рассмотрит лучшую практику. Чтобы найти это, я бы предложил вам посмотреть на любые образцы кода, на которые ссылается ссылка класса NSUserDefaults.

Ответ 2

возможно, лучшая идея - зарегистрировать некоторые значения по умолчанию для NSUserDefaults, используя

(void)registerDefaults:(NSDictionary *)dictionary

см. документацию Apple по адресу https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html#//apple_ref/doc/uid/20000318-SW5

Чтобы вернуться к исходной проблеме: в прошлом я использовал NSUserDefaults.dictionaryRepresentation, чтобы проверить наличие ключа:

BOOL playSound;
BOOL playVibrate;

//test for some defaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (nil == [prefs dictionaryRepresentation]["pref_sound"]) {
    playSound = YES;
    playVibrate = YES; 
} else {
    playSound = [prefs boolForKey:@"pref_sound"];
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
}


if (playSound) {
    //do stuff
}

Надеюсь, это сработает для вас.

Ответ 3

Решение Kevin Conner работает для меня, но есть еще одна вещь, о которой я думаю, должен указать.

Мое приложение предпочитает ручную работу с правшами по умолчанию. Когда я нажму на запуск в Xcode, используйте приложение, чтобы изменить свое предпочтение на левую сторону, а затем запустите его во второй раз, мое предпочтение по-прежнему прав.

Кажется, что запуск в Xcode стирает настройки. Я решил вручную выйти из приложения из симулятора, открыть его снова изнутри, а затем увидел новые настройки.