Ответ 1
Проблема заключается в том, что тип default Value
должен быть boolean
not string
;) удалить это значение и снова добавить другое свойство default Value
надеюсь, что это поможет
У меня есть приложение iOS с параметром settings.bundle, который обрабатывает различные настройки для моего приложения с помощью Switch toggle
. Я устанавливаю значения по умолчанию в файле root.plist(используя свойство DefaultValue) на YES
, но в любое время, когда приложение запускается на устройстве или симуляторе iOS, все значения идут NO
. Он работал хорошо только при первом запуске.
Я извлекаю значения по умолчанию с этим кодом (я делаю что-то не так здесь?):
NSUserDefaults *localeDefaults = [NSUserDefaults standardUserDefaults];
BOOL ENWORDS = [localeDefaults boolForKey:@"localetime"];
Проблема заключается в том, что тип default Value
должен быть boolean
not string
;) удалить это значение и снова добавить другое свойство default Value
надеюсь, что это поможет
Значение по умолчанию используется параметрами Settings.app только для отображения. Если вы не измените значение в приложении настроек, ничего не будет сохранено в NSUserDefaults.
Вы должны сами регистрировать значения по умолчанию. Используйте что-то вроде этого в application:didFinishLaunchingWithOptions:
:
NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @"localetime",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
Это сообщение в блоге может помочь: http://greghaygood.com/2009/03/09/updating-nsuserdefaults-from-settingsbundle
tl; dr - пока пользователь не откроет страницу настроек, значения по умолчанию не будут скопированы в ваше приложение. Это ожидаемое поведение Apple.
Лично я думаю, что это ужасно. Это означает, что вам нужно будет установить свои значения по умолчанию в том случае, если пользователь запустит ваше приложение, не перейдя сначала на страницу настроек (что будет верно для примерно 99% случаев использования).
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//< Register Defaults
NSString *settingsBundlePath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
NSBundle *settingsBundle = [NSBundle bundleWithPath:settingsBundlePath];
NSString *rootPlistPath = [settingsBundle pathForResource:@"Root" ofType:@"plist"];
NSDictionary *settingsDict = [[NSDictionary alloc] initWithContentsOfFile:rootPlistPath];
NSArray *settingsItems = [settingsDict objectForKey:@"PreferenceSpecifiers"];
NSMutableDictionary *defaultDict = [NSMutableDictionary new];
for (NSDictionary *itemDict in settingsItems) {
if ([itemDict objectForKey:@"DefaultValue"]) {
[defaultDict setObject:[itemDict objectForKey:@"DefaultValue"] forKey:[itemDict objectForKey:@"Key"]];
}
}
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];
//< Following Code
}
Вы можете проверить, было ли задано значение, получая objectForKey и проверяя, равен ли он нулю.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
id dataExists = [userDefaults objectForKey:@"light_switch"];
BOOL lightSwitch;
if (dataExists != nil) {
lightSwitch = [userDefaults boolForKey:@"light_switch"];
NSLog(@"light_switch is %d", validateCertificates);
} else {
lightSwitch = YES; // default value
NSLog(@"light_switch not set, default value is %d", validateCertificates);
}