iPhone首选项(NSUserDefaults)不起作用,键总是返回nil

时间:2010-07-19 05:48:50

标签: iphone nsuserdefaults

我在我的Settings.bundle中做了一些偏好,在“设置”应用中显示正常。但是当我读回它时,我的设置总是返回nil。我知道我需要在第一次启动时设置默认值。但即使在那之后并进入设置菜单(也应该设置默认值) - 当我回读它时,我总是没有。

即使我设置了默认值并立即将其读回来,我也没有了!

  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"displaySunTimes"];
  [defaults registerDefaults:appDefaults];
  [defaults synchronize];

  bool test =[defaults boolForKey:@"displaySunTimes"];
  NSLog(@" Value %@", test);

这是我的root.plist

的开头
<dict>
    <key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
            <dict>
                    <key>Type</key>
                    <string>PSGroupSpecifier</string>
                    <key>Title</key>
                    <string>Display Sunrise / Sunset times for your location.</string>
            </dict>
            <dict>
                    <key>Type</key>
                    <string>PSToggleSwitchSpecifier</string>
                    <key>Title</key>
                    <string>Sunrise / Sunset</string>
                    <key>Key</key>
                    <string>displaySunTimes</string>
                    <key>DefaultValue</key>
                    <true/>
                    <key>TrueValue</key>
                    <string>YES</string>
                    <key>FalseValue</key>
                    <string>NO</string>
            </dict>

3 个答案:

答案 0 :(得分:2)

如果您想存储BOOL,请使用:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"displaySunTimes"];

为了从默认值中检索它:

[[NSUserDefaults standardUserDefaults] boolForKey:@"displaySunTimes"];

修改的:
NSLog(@" Value %@", test);更改为NSLog(@" Value %i", test);(BOOL不是对象) 此外,请使用BOOL代替bool

答案 1 :(得分:1)

如果您了解@"YES"[NSNumber numberWithBOOL:YES]YES之间的区别,这会有所帮助。

在这种情况下,它返回“NO”((BOOL)0),而不是“nil”((id)0)。如果您想知道是否存储了某些内容,请使用objectForKey:。在这种情况下,您存储NSString @“YES”并尝试将其作为bool读取;我推荐你到boolForKey的文档:

  

如果布尔值与用户默认值中的defaultName相关联,则返回该值。否则,返回NO。

字符串不是布尔值,因此@“YES”变为NO。尝试这样的事情:

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBOOL:YES] forKey:@"displaySunTimes"];

答案 2 :(得分:0)

  • 使用String表示bool值有点奇怪。 尝试使用[NSNumber numberWithBOOL: YES]正如其他人指出的那样(我已经忘记了),请使用NSUserDefaults上的boolForKey:setBool:forKey: API。

  • 当我遇到类似这样的事情时,是因为我以某种方式设法将错误的默认值推送到默认数据库中。你确定你没有上一次运行的默认值吗?

注册默认值是以前未设置值时使用的默认值。


除非在每次运行之间删除应用程序和所有数据,否则这听起来仍然与您已设置的默认值完全相同,并且注册默认值不会覆盖它(正确的行为)。

尝试手动将默认值设置为其他值并进行同步。

另请注意,synchronize与注册默认值完全正交。