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