【问题标题】:NSUserDefaults - Saving Data For Use and Reuse - Erasing on each new startup?NSUserDefaults - 保存数据以供使用和重用 - 在每次新启动时擦除?
【发布时间】:2011-12-15 22:32:59
【问题描述】:

因此,对于我的游戏,我保存了用户是否已解锁通电的“布尔”值。为此,我使用 NSUserDefaults。我最初在网上关注了一个关于 NSUserDefaults 的教程,所以让我把我的代码和解释(以下所有代码都在 AppDelegate.m 文件中):

(注意:“save”是一个宏:[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”语句都是“是”,并且所有值都根据第一个代码框重置......然后导致第二个代码框相应地采取行动并且没有数组填充,因为所有内容都已重置...

这可能与registerDefaults有关吗,甚至有必要调用或使用,因为我很确定这是问题所在?

谢谢大家,希望我很清楚:)

rnc505

【问题讨论】:

  • 你是在模拟器还是在设备上测试这个?
  • 我在两者上都进行了测试,但这发生在设备上。我似乎无法在模拟器上对此进行正确测试,但显然,无论如何,设备是最重要的。

标签: ios cocos2d-iphone nsuserdefaults uiapplicationdelegate


【解决方案1】:

问题是 registerDefaults 没有按照 Apple Docs 写入磁盘

注册域的内容没有写入磁盘;你 每次应用启动时都需要调用这个方法。

您有 2 个选项,1) 不要使用 registerDefaults 并像这样保存您的“日期”

[save setObject:[NSDate date] forKey:@"dateKey"];

这将导致它被写入磁盘并且您的代码将正常工作。

更健壮的方法是将所有通电写入 registerDefaults 并取消日期。为了确保 registerDefaults 在其他任何事情之前被调用,请将其放在 appDelegate 的初始化方法中,如下所示:

+ (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];
}

【讨论】:

  • 所以每次启动时,都会调用这个方法。然后,如果这些值不存在,则会创建它们,如果它们已经存在,则会被忽略。但是数据如何持续存在呢?通过随后的[save setObject:[OBJECT] forKey:[KEY]][save sychronize] 调用?
  • Registers上面的initialize方法中的代码在每次app运行时默认。如果 NSUserDefaults 中没有该键的值,则使用该键。然后,每当用户获得电源时,您都会将其保存到磁盘调用[[NSUserDefaults standardDefaults] setBool:YES forKey:POWER_4];
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多