设置捆绑包默认值不会设置

时间:2012-02-07 18:14:25

标签: ios objective-c nsuserdefaults settings.bundle

我有一个带有settings.bundle的iOS应用程序,它使用Switch toggle处理我的应用程序的各种设置。我将root.plist文件中的默认值(使用DefaultValue属性)设置为YES,但只要应用程序在设备或iOS模拟器上启动,所有值都会NO。它只在第一次发布时运作良好。

Settings Bundle PLIST

我正在使用此代码检索默认值(我在这里做错了吗?):

NSUserDefaults *localeDefaults = [NSUserDefaults standardUserDefaults];
BOOL ENWORDS = [localeDefaults boolForKey:@"localetime"];

5 个答案:

答案 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);
   }