ios - NSUserDefaults - 保存数据以供使用和重用 - 每次新启动时都会删除?

标签 ios cocos2d-iphone nsuserdefaults uiapplicationdelegate

因此,对于我的游戏,我将保存用户是否已解锁加电的“bool”值。为此,我使用 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”语句都是"is",并且所有值都根据第一个代码框重置...然后导致第二个代码框相应地执行操作并且没有数组人口,因为一切都已重置...

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

谢谢大家,希望我说清楚了:)

rnc505

最佳答案

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

The contents of the registration domain are not written to disk; you need to call this method each time your application starts.

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

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

这将导致它被写入磁盘,并且您的代码将起作用。

更可靠的方法是将所有的 powerups 写入 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];
}

关于ios - NSUserDefaults - 保存数据以供使用和重用 - 每次新启动时都会删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8527584/

相关文章:

ios - 用于在 UITableView 中存储和检索数组的 NSUserDefaults

ios - 将内容添加到 NSUserDefaults - 多个 View

ios - 如何将用户输入从 6 个 OTP UITextFields 存储到属性,然后将值传递给 Firebase 电话身份验证以在 Swift 4 中进行验证

ios - 关闭模态视图时无法形成对 UIScrollView 子类 (EXC_BAD_INSTRUCTION) 的弱引用

c++ - 创建 CCSequence 时,CCFiniteTimeAction::getDuration() EXC_BAD_ACCESS

ios - 使用自定义字体文件创建 CCMenuItemLabel

ios - iOS 上的 Cocos2d : EXC_BAD_ACCESS in CCGraphicsBufferGLUnsynchronized when leaving app after ad

ios - 如何在 iOS 中将八进制(unicode 代码点)转换为 NSString

ios - Firebase:没有这样的文件或目录 GoogleInterchangeUtilities.framework/Headers

ios - 将分数添加到已保存的分数中