NSUserDefaults - 保存数据以供使用和重用 - 在每次新启动时擦除?

时间:2011-12-15 22:33:00

标签: ios cocos2d-iphone nsuserdefaults uiapplicationdelegate

因此,对于我的游戏,我正在保存用户是否已解锁通电的“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

1 个答案:

答案 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];
}