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