离开应用后,NSUserDefaults将无法加载

时间:2011-12-28 23:45:12

标签: objective-c ios integer nsuserdefaults

我在我的应用中设置了多个NSUserDefaults,大部分都可以使用。 NSUserDefaults从一个ViewController调用,并在另一个ViewController中实现(例如在具有级别选择的游戏中)。这似乎很有效,直到用户按下水平选择屏幕上的后退按钮。当他们尝试返回级别选择viewController时,NSUserDefaults不会加载到屏幕上。 这是我的代码:

LevelSelectViewController:

- (void)viewDidLoad
{       
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults synchronize];

    [super viewDidLoad];
}

- (void)Level1DidFinish:(Level1 *)controller
{
    [self dismissModalViewControllerAnimated:YES];

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSInteger rank = [userDefaults integerForKey:@"levelRank"];
    {
        if (rank == 1) {
            button2.hidden = NO;

        }
    }
}

Level1ViewController:

{            
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setInteger:1 forKey:@"levelRank"];
}

3 个答案:

答案 0 :(得分:4)

设置密钥值后,需要调用[userDefaults synchronize]。自动同步很少发生,因此在这种情况下,当一个完成一个级别时,同步将不会发生。

所以修改你的代码:

Level1ViewController:

{            
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setInteger:1 forKey:@"easyRank"];
    [userDefaults synchronize];
}

答案 1 :(得分:2)

您的第一个问题是您正在创建userDefaults的实例,但未设置任何值。所以在这里调用 synchronize 实际上什么都不做:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults synchronize];

设置Integer后,您需要致电synchronize

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:1 forKey:@"easyRank"];
[userDefaults synchronize];

答案 2 :(得分:0)

您正在为两个不同的键设置值。你期待发生什么?

Level1ViewController需要为levelRank设置值,或LevelSelectViewController需要读取easyRank键的值。