我有一个带有settings.bundle的iOS应用程序,它使用Switch toggle
处理我的应用程序的各种设置。我将root.plist文件中的默认值(使用DefaultValue属性)设置为YES
,但只要应用程序在设备或iOS模拟器上启动,所有值都会NO
。它只在第一次发布时运作良好。
我正在使用此代码检索默认值(我在这里做错了吗?):
NSUserDefaults *localeDefaults = [NSUserDefaults standardUserDefaults];
BOOL ENWORDS = [localeDefaults boolForKey:@"localetime"];
答案 0 :(得分:23)
Settings.app使用默认值仅用于显示目的。如果您未更改设置应用程序中的值,则不会将任何内容保存到NSUserDefaults。
您必须自己注册默认值。在application:didFinishLaunchingWithOptions:
:
NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @"localetime",
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
答案 1 :(得分:21)
此博文可能有所帮助:http://greghaygood.com/2009/03/09/updating-nsuserdefaults-from-settingsbundle
tl; dr - 在用户打开设置页面之前,默认值不会复制到您的应用中。这是Apple的预期行为。
就个人而言,我认为这很可怕。这意味着您必须在代码中设置默认值,以防用户启动您的应用程序而无需先进入设置页面(大约99%的用例都是如此!)
答案 2 :(得分:15)
问题是default Value
的类型必须是boolean
而不是 string
;)删除此值并再次添加另一个default Value
属性
希望这有帮助
答案 3 :(得分:4)
- (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
}
答案 4 :(得分:1)
您可以通过获取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);
}