gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:52:50 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com