2012-02-07 62 views
14

我有一个iOS应用程序,它有一个settings.bundle,它可以处理我的应用程序的各种设置,其中Switch toggle。我在我的root.plist文件中设置了默认值(使用DefaultValue属性)至YES,但是当应用程序在设备或iOS模拟器上启动时,所有值均为NO。它只在首次发布时运行良好。设置包的默认值不会设置

Settings Bundle PLIST

我检索与此代码默认值(我在这里做得不对?):

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

我们可以看到的plist呢? – deanWombourne 2012-02-07 18:17:20

+0

我添加了一个图片 – 2012-02-07 18:20:07

回答

14

问题是类型的default Value必须booleanstring;)删除此值,然后再添加一个又一个default Value属性 希望这有助于

+2

YEYEYEYES谢谢! – 2012-02-07 20:49:40

+0

这些值可以是任何类型 – user102008 2014-03-18 22:23:03

20

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

你必须自己注册默认值。使用这样的事情在application:didFinishLaunchingWithOptions:

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithBool:YES], @"localetime", 
             nil]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults]; 
+0

不!什么都没发生 !同样的问题... Xcode 4.2有很多错误 – 2012-02-07 18:33:51

+1

你回答解决了我的另一个问题! – 2012-02-19 16:09:45

+2

+1以获得最佳建议,但这是一种解决方法,因为这样设置的值可能与plist中的默认值不同。 如果没有用户设置,最好将plist中的默认值作为要显示的值。 – jackal 2013-10-13 12:42:06

19

本博客文章可能有帮助:http://greghaygood.com/2009/03/09/updating-nsuserdefaults-from-settingsbundle

TL;博士 - 直到用户打开设置页面,则默认设置不会被复制到您的应用程序。这是Apple预期的行为。

我个人认为这很糟糕。这意味着你必须在代码中设置你的默认值,以防万一用户启动你的应用程序而不先进入设置页面(对于大约99%的用例,这将是真实的!)

+0

ops !!!有很多代码!我放弃 – 2012-02-07 19:46:59

+0

tl; dr代表'太长;没有阅读' - 我的回答的第二段总结了博客文章,以防你没有通读博客文章;)基本上,你必须处理代码和plist中的默认设置 - plist只生效如果用户首先进入设置页面。 – deanWombourne 2012-02-07 20:15:37

+1

请参阅http://ijure.org/wp/archives/179,其中解释了当用户进入设置时并非所有类型都设置了其默认值,并且在某些情况下用户必须实际选择除在为该项目保存任何值之前的默认值。在我的情况下,我注意到多值项目未被设置为默认值。 – ghr 2013-10-03 03:49:03

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); 
    } 
+1

处理问题的方式不好,不好。改用'-registerDefaults:'代替。请参阅http:// oleb。net/blog/2014/02/nsuserdefaults-handling-default-values/ – KPM 2015-02-13 08:57:56

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 
} 
+0

这很好,如果你没有任何你想从iOS设置改变的变量设置。但是,如果您正在更改if语句以检查'Key'是否不存在,并且它不存在,请将默认值对象的键设置为'NSUserDefaults'。 – mylogon 2017-01-03 00:41:24