我在我的应用中设置了多个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"];
}
答案 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
键的值。