1

我在我的应用程序中设置了几个用户默认值:

快照开/关 启动提示 开/关 游戏音乐 开/关 iPod音乐 开/关 音效 开/关 重置所有玩偶 开/关

当我的应用程序进入后台(在 OS 4.0 中)时,我的 saveDefaults: 方法从 applicationWillResignActive:(UIApplication *) 方法中调用。

然后在 applicationWillEnterForeground: 方法中,我再次加载我的用户默认值。然后我调用一个方法来启动 menuMusic(如果它已启用)。

使用相当简单的保存默认方法应该可以工作:

- (void)saveGameDefaults {

 [[NSUserDefaults standardUserDefaults] setObject:(NSString *)myDoll.currentDoll forKey:@"DollName"];
 [[NSUserDefaults standardUserDefaults] setInteger:[gameState intValue] forKey:@"GameState"];
 [[NSUserDefaults standardUserDefaults] setInteger:[startScreen intValue] forKey:@"StartScreen"];
 [[NSUserDefaults standardUserDefaults] setBool:snapShots forKey:@"SnapShots"];
 [[NSUserDefaults standardUserDefaults] setBool:resetDolls forKey:@"Reset"];
 [[NSUserDefaults standardUserDefaults] synchronize];


}

这是我的加载默认方法的一小部分:

{
    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"GameState"] == nil) gameState = [NSNumber numberWithInt:MENU_VIEW];
 else gameState = [[NSUserDefaults standardUserDefaults] objectForKey:@"GameState"];


 if ([[NSUserDefaults standardUserDefaults] objectForKey:@"StartScreen"] == nil) startScreen = [NSNumber numberWithInt:SHOW_START_SCREEN];
 else startScreen = [[NSUserDefaults standardUserDefaults] objectForKey:@"StartScreen"];



 if ([[NSUserDefaults standardUserDefaults] objectForKey:@"GameSound"] == nil) gameSound = [NSNumber numberWithInt:SOUNDS_ON];
 else gameSound = [[NSUserDefaults standardUserDefaults] objectForKey:@"GameSound"];
}

似乎,当应用程序从后台返回时,默认值尚未更新或可用。我通过直接切换到 iPhone 设置,更改设置,然后通过双击主页按钮并选择我的应用程序直接切换回来,将其发送到后台。但是,如果我再次退出并重新进入它将读取已设置的新设置。

例如: 1. 我启用了音乐并启动了应用程序。音乐在菜单上播放。2.我双击主页按钮并选择我的设置应用程序并将菜单音乐设置更改为否。3.双击主页按钮并切换回游戏。音乐仍在播放。4. 再次双击主页并返回设置应用程序。菜单音乐仍设置为 NO。5.第二次切换回我的应用程序,现在音乐不再播放了。

当应用程序处于后台时,还有其他人在更新用户设置时遇到问题吗?

提前致谢 - 马克

4

2 回答 2

2

发现从后台返回后,我需要在获取 key 对象之前对 standardUserDefaults 进行同步。

于 2010-06-24T00:49:23.300 回答
1

谢谢你的提示。对于任何寻找代码的人:

- (void)applicationDidBecomeActive:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] synchronize];
}
于 2011-05-23T08:49:42.813 回答