iPhone偏好设置(NSUserDefaults)不起作用,按键总是返回零

iPhone偏好设置(NSUserDefaults)不起作用,按键总是返回零

问题描述:

我在Settings.bundle中设置了一些偏好设置,它们在设置应用中显示正常。但是,当我读回他们时,我的设置总是返回零。我知道我需要在第一次启动时设置一个默认值。但即使如此,进入设置菜单(它也应该设置默认值) - 当我读回他们时,我总是得到零。iPhone偏好设置(NSUserDefaults)不起作用,按键总是返回零

即使当我设置了默认值并立即读回,我得到零!

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> 

如果你想存储BOOL然后使用:

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

为了从默认检索:

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

编辑
更改NSLog(@" Value %@", test);NSLog(@" Value %i", test);(BOOL是不是一个对象)。
另外,使用BOOL而不是bool

+0

仍然没有工作:(多么奇怪,就好像“dislaySunTimes”键没有正确设置 – paranoidroid 2010-07-19 07:18:52

+0

我编辑了我的答案,看看它是否能解决你的问题... – 2010-07-19 08:01:41

+0

更喜欢C99的BOOL BOOL是signed char。 – 2010-07-19 18:56:09

  • 有点奇怪使用一个字符串来表示一个布尔值开始。 改为尝试[NSNumber numberWithBOOL: YES]正如其他人指出的(我忘记了),在NSUserDefaults上使用boolForKey:setBool:forKey: API。

  • 当我遇到这样的事情时,这是因为我以某种方式设法将错误的默认值推入默认数据库。你确定你没有从前面的运行默认值?

注册默认值是未预先设置值时使用的默认值。


除非应用程序,所有数据被每次运行时被删除,那么这仍然听起来完全像你有一个默认值已经设置和注册默认是不覆盖它(正确的行为)。

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

还要注意synchronize与注册默认值完全正交。

+0

仍然没有与那个布尔。我确定我没有任何偏好,我删除了应用程序并重新安装并再次尝试。我的root.plist在上面。 – paranoidroid 2010-07-19 06:08:30

如果您了解@"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"];