【问题标题】:iPhone preferences (NSUserDefaults) not working, keys always return niliPhone 首选项(NSUserDefaults)不起作用,键总是返回 nil
【发布时间】:2011-03-17 18:18:05
【问题描述】:

我在 Settings.bundle 中设置了一些首选项,这些首选项在“设置”应用中显示良好。但是,当我读回它们时,我的设置总是返回 nil。我知道我需要在第一次启动时设置一个默认值。但即使在那之后进入设置菜单(也应该设置默认值) - 当我读回它们时,我总是得到零。

即使我设置了默认值并立即读回它,我也得到了 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>

【问题讨论】:

    标签: iphone nsuserdefaults


    【解决方案1】:

    如果要存储 BOOL,请使用:

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

    为了从默认值中检索它:

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

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

    【讨论】:

    • 仍然无法正常工作:(多么奇怪。好像“dislaySunTimes”键设置不正确。
    • 首选 C99 的布尔值。 BOOL 是一个有符号字符。
    【解决方案2】:

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

    在这种情况下,它返回“NO”((BOOL)0),而不是“nil”((id)0)。如果您想知道是否存储了某些内容,请使用objectForKey:。在这种情况下,您正在存储 NSString @"YES" 并尝试将其读取为布尔值;我建议您参考 boolForKey 的文档:

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

    字符串不是布尔值,因此@"YES" 变为 NO。试试这样的:

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

    【讨论】:

      【解决方案3】:
      • 使用字符串来表示布尔值有点奇怪。 改用 [NSNumber numberWithBOOL: YES] 正如其他人指出的(我已经忘记了),在 NSUserDefaults 上使用 boolForKey:setBool:forKey: API。

      • 当我遇到这样的事情时,这是因为我设法将错误的默认值推送到默认数据库中。您确定没有保留上一次运行的默认值吗?

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


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

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

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

      【讨论】:

      • 仍然没有那个布尔值。确定我没有任何偏好设置,我删除了该应用程序并重新安装并再次尝试。我的 root.plist 在上面。
      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多