因此,对于我的游戏,我正在保存用户是否已解锁通电的“bool”值。为此我使用的是NSUserDefaults。我最初在网上关于NSUserDefaults的教程,所以让我把我的代码和解释(所有以下代码都在AppDelegate.m文件中):
(注意:“保存”是以下内容的宏:[NSUserDefaults standardUserDefaults]
)
powerups = [[NSMutableArray alloc] init];
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"dateKey"] == nil) {
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:[NSDate date], @"dateKey", nil];
[save setBool:NO forKey:POWER_1];
[save setBool:NO forKey:POWER_2];
[save setBool:NO forKey:POWER_3];
[save setBool:NO forKey:POWER_4];
[save setBool:NO forKey:POWER_5];
[save setBool:NO forKey:POWER_6];
[save setBool:NO forKey:POWER_7];
[save setBool:NO forKey:POWER_8];
[save setBool:NO forKey:POWER_9];
[save setInteger:0 forKey:@"1HighScore"];
[save setInteger:0 forKey:@"2HighScore"];
[save setInteger:0 forKey:@"3HighScore"];
[save setInteger:0 forKey:@"CumulativeScore"];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"firstrun");
}
所以在上面的代码中,我创建了一个数组,可以从我游戏中的任何类调用,它存储所有可用的通电。只有在第一次玩游戏时才会调用此“if”语句,因为它会在NSUserDefaults中创建所有数据值。注意:我使用越狱的iPhone并检查了创建的.plist文件。似乎没有任何使用“dateKey”值调用/的值。教程说这是检查这是否是第一次运行的方法,因为如果日期值不存在那么它的第一次运行等。逻辑上,它是有道理的。
现在,以下代码填充数组,假设NSUserDefaults必须存在,无论它是否只是“填充”或先前保存过:
if([save boolForKey:POWER_1])
[powerups addObject:POWER_1];
if([save boolForKey:POWER_2])
[powerups addObject:POWER_2];
if([save boolForKey:POWER_3])
[powerups addObject:POWER_3];
if([save boolForKey:POWER_4])
[powerups addObject:POWER_4];
if([save boolForKey:POWER_5])
[powerups addObject:POWER_5];
if([save boolForKey:POWER_6])
[powerups addObject:POWER_6];
if([save boolForKey:POWER_7])
[powerups addObject:POWER_7];
/*if([save boolForKey:POWER_8])
[powerups addObject:POWER_8];*/
if([save boolForKey:POWER_9])
[powerups addObject:POWER_9];
现在,似乎在每次新运行时,第一个“if”语句为YES,并且根据第一个代码框重置所有值...然后导致第二个代码框相应地执行并且没有数组,因为一切都已重置......
这可能与registerDefaults
有关,是否需要打电话或使用,因为我很确定这是问题所在?
谢谢大家,希望我很清楚:)
rnc505
答案 0 :(得分:1)
问题是registerDefaults没有按照Apple Docs
写入磁盘注册域的内容不会写入磁盘;您 每次应用程序启动时都需要调用此方法。
您有2个选项,1)不使用registerDefaults并保存您的“日期”,如下所示
[save setObject:[NSDate date] forKey:@"dateKey"];
这将导致它被写入磁盘,您的代码将起作用。
更强大的方法是将所有的电源写入registerDefaults并取消日期。为了确保在appDelegate的initialize方法中将registerDefaults调用之前调用registerDefaults,如下所示:
+ (void)initialize {
NSMutableDictionary *defs = [NSMutableDictionary dictionary];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_!];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_2];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_3];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_4];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_5];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_6];
[defs setObject:[NSNumber numberWithBool:NO] forKey:POWER_7];
[[NSUserDefaults standardUserDefaults] registerDefaults:defs];
}