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....

какие-либо идеи?

11
задан Brad Werth 21 September 2012 в 15:39
поделиться

1 ответ

Прежде всего, у вас есть ошибка в вашем условии . Вы проверяете само логическое значение, которое, согласно документации 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 посчитают лучшей практикой. Чтобы это выяснить, я бы посоветовал посмотреть на любые примеры кода, на которые ссылаются из ссылки на класс NSUserDefaults.

.
17
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: