【问题标题】:Cannot set NSUserDefaults field无法设置 NSUserDefaults 字段
【发布时间】:2011-01-31 20:34:10
【问题描述】:

我的应用程序初始化(第一次)中有以下代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid=@"1";
[defaults setObject:uid forKey:@"init_val"];
[defaults synchronize];

在代码的稍后部分(响应按钮按下)我使用以下方法检查值:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *initVal=[defaults objectForKey:@"init_val"];

initVal 始终为零。我已经检查并且 init_val 在我的设置包中的设置与另一个我可以毫无问题地设置和读取的字段完全相同(它们都设置有一个名为“Key”的字段。

【问题讨论】:

  • 嗯,奇怪。如果您使用 -stringForKey: 而不是 -objectForKey: 会发生同样的事情吗?另外,-synchronize 是否返回 YES?
  • 我先尝试了 stringForKey。并同步返回YES
  • 参考我的回答。我相信你会在我的回答中得到你的解决方案。如果您对我的回答有任何问题,请发表评论。

标签: iphone nsuserdefaults


【解决方案1】:

@mlewis54:

你可以试试这个代码。我很确定它对你有用。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid=@"1";
[defaults setObject:uid forKey:@"init_val"];
[defaults synchronize];

要检索数据,您应该使用以下代码:

NSString *initVal=[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"];

NSString *initVal=[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"];

编辑:

如果它仍然给出nil,那么你可以使用以下代码:

NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"]];

NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"]];

希望对你有所帮助。

【讨论】:

  • 感谢您的回答。最终我让它以这种方式工作。在一天结束的时候,它被证明是没有实际意义的。我将设置功能移到应用程序中,不再使用设置包或默认设置。感谢大家的意见。
  • @mlewis54:不客气。我很高兴它对您有所帮助。 :-)
【解决方案2】:

在点击按钮的事件中减速...

NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults];
[savedData setObject:userEmailTextField.text forKey:@"userid"];

并在加载时加载数据并检查您输入的值是否显示...

userEmailTextField.text =[[NSUserDefaults standardUserDefaults]objectForKey:@"userid"];

【讨论】:

    【解决方案3】:

    你需要使用这条线

    NSString *initVal = [defaults stringForKey:@"init_val"];
    

    - 因为它是一个字符串,所以你必须使用stringForKey。您可以类似地使用boolForKey 来获取布尔值。

    【讨论】:

      【解决方案4】:

      您的代码没有任何问题,我尝试将其复制到我的项目中并且效果很好, 所以你的错误可能是在你检查 initVal 时...

      您使用什么代码来查看 initVal 是否为 nil? 您确定在何时/何地检查 initVal,var/oblect 仍然可见吗?

      尝试在阅读代码后立即插入:

      NSLog(@"____text read in pref: %@", initVal);
      

      它在我的控制台窗口中写入 -> __text read in pref: 1

      当然它是一个 NSString,我希望你在检查它时记住它不是一个 int 或 NSNumber...

      卢卡

      【讨论】:

      • 我使用 if (!initVal) { >> } 检查 initVal。当我回到办公桌时,我将发布调试器值。我相信它是0x0。没有范围问题,因为我是连续执行语句(上面的 2 条我得到默认值,然后是 if 语句)。
      • 那么我向你保证代码是正确的,我试过这个: NSString *initVal=[defaults objectForKey:@"init_val"]; if (!initVal){ NSLog(@"__1__text read in pref: %@", initVal); }else { NSLog(@"__2__text read in pref: %@", initVal); //这是在控制台窗口中执行的}:__2__text read in pref: 1 then a bug应该在其他地方...尝试在xcode的“构建”菜单下“清理所有目标”...它发生在设备中还是在模拟器?
      【解决方案5】:

      可能是初始化没有发生。将 NSLog 放在那里检查它是否已执行。

      【讨论】:

        【解决方案6】:

        使用相同的代码对我来说效果很好:

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *uid=@"1";
        [defaults setObject:uid forKey:@"init_val"];
        [defaults synchronize];
        
        NSUserDefaults *defaultss = [NSUserDefaults standardUserDefaults];
        NSString *initVal=[defaultss objectForKey:@"init_val"];
        NSLog(@"Value of initVal: %@",initVal);
        

        控制台上的O/P:initVal的值:1

        所以尝试使用相同的代码在控制台上打印。

        【讨论】:

          【解决方案7】:

          你确定你正确初始化了 NSUserDefaults 吗?当我初始化时,在我的应用程序委托中,我总是通过创建默认值的字典来创建默认用户默认值:

          [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
          

          其中 appDefaults 是字典。那么您应该能够正确访问它们。

          【讨论】:

          • 在应用程序委托的其他地方,我将字典设置为默认值(值/键)对。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-03
          • 1970-01-01
          • 1970-01-01
          • 2016-01-23
          • 2014-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多