【问题标题】:NSUserDefaults won't save permanantlyNSUserDefaults 不会永久保存
【发布时间】:2011-06-14 20:24:05
【问题描述】:

我正在制作一个相当简单的 iPhone 应用程序。但是,我无法让我的 NSUserDefaults 永久保存。写入和检索数据不是问题——我可以保存数据(在我的情况下,是一个字符串),并在命令中检索它,即使在切换视图、关闭/打开应用程序等之后,也可以检索数据美好的。看起来好像字符串已正确保存到密钥中。但是当我从多任务托盘退出应用程序并重新启动它时,设置不再保存,应用程序像第一次一样启动。我是一个新手程序员,所以这可能只是我的一个愚蠢的错误。

这是保存的样子:

if (optionsSoundBox.center.x >= 240)
    {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:.2];
        self.soundOnLabel.alpha = 1;
        self.soundOffLabel.alpha = 0;
        [UIView commitAnimations];

        NSUserDefaults *soundOptions = [NSUserDefaults standardUserDefaults];
        [soundOptions setObject:@"SoundsON" forKey:@"SoundKey"];
        [soundOptions synchronize];
    }

    if (optionsSoundBox.center.x < 240)
    {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:.2];
        self.soundOnLabel.alpha = 0;
        self.soundOffLabel.alpha = 1;
        [UIView commitAnimations];

        NSUserDefaults *soundOptions = [NSUserDefaults standardUserDefaults];
        [soundOptions setObject:@"SoundsOFF" forKey:@"SoundKey"];
        [soundOptions synchronize];
    }

我在 viewDidLoad 中检索字符串,因此它将在启动时准备好,如下所示:

NSUserDefaults *soundOptions = [NSUserDefaults standardUserDefaults];
    NSString *savedSoundSettings = [soundOptions stringForKey:@"SoundKey"];

    if (savedSoundSettings == @"SoundsON")
    {
        [optionsSoundBox setCenter:CGPointMake(280, optionsSoundBox.center.y)];
    }

    if (savedSoundSettings == @"SoundsOFF")
    {
        [optionsSoundBox setCenter:CGPointMake(200, optionsSoundBox.center.y)];
    }

非常感谢您提供的任何帮助

【问题讨论】:

    标签: iphone objective-c xcode nsuserdefaults


    【解决方案1】:

    还因为你得到的是stringForKey: 而不是objectForKey:

    如果您只使用[[NSUserDefaults standardUserDefaults] setBool: YES forKey: @"SoundsON"]; 然后检查boolForKey: @"SoundsON" 是否为真,也许对您来说会更容易。

    【讨论】:

      【解决方案2】:

      您应该使用[savedSoundSettings isEqualToString:@"SoundsON"],而不是使用双等号运算符。 (==)。

      除此之外,可能是您在viewDidLoad 内运行此代码。尝试在 viewWillAppear 内运行它。

      最后,我建议对设置键使用驼峰式名称,这样从长远来看会更容易输入。 (想想soundsOn 而不是SoundsON。)

      【讨论】:

        【解决方案3】:

        您不应将字符串与== 进行比较。比较字符串的正确方法是通过isEqualToString:。因此,您在检索用户默认值时的 if 语句应如下所示:

        if ([savedSoundSettings isEqualToString:@"SoundsON"])
        {
            ....
        }
        

        编辑:此外,从概念上讲,您要检查的只是单个状态变量是打开还是关闭。因此,理想情况下,您应该使用 [NSUserDefaults setBool:forKey:][NSUserDefaults boolForKey:] 之类的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多