15

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

设置捆绑 PLIST

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

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

5 回答 5

27

Settings.app 使用默认值仅用于显示目的。如果您不更改设置应用程序中的值,则不会将任何内容保存到 NSUserDefaults。

您必须自己注册默认值。在application:didFinishLaunchingWithOptions:

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithBool:YES], @"localetime",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
于 2012-02-07T18:25:48.023 回答
24

这篇博文可能会有所帮助: http: //greghaygood.com/2009/03/09/updating-nsuserdefaults-from-settingsbundle

tl;dr - 在用户打开设置页面之前,默认值不会复制到您的应用程序中。这是 Apple 的预期行为。

就个人而言,我认为这很可怕。这意味着您必须在代码中设置默认值,以防用户在没有先进入设置页面的情况下启动您的应用程序(这对于大约 99% 的用例来说都是如此!)

于 2012-02-07T18:32:41.747 回答
17

问题是类型default Value必须boolean不是string;)删除此值并再次添加另一个default Value属性希望这会有所帮助

于 2012-02-07T20:48:59.720 回答
5
- (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
}
于 2016-02-17T23:24:17.220 回答
1

您可以通过获取objectForKey并检查它是否为nil来检查该值是否已设置。

   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);
   }
于 2013-03-08T20:17:16.117 回答