Ios 如何使用NSUserDefault将项添加到NSMutableArray

Ios 如何使用NSUserDefault将项添加到NSMutableArray,ios,objective-c,nsmutablearray,sprite-kit,Ios,Objective C,Nsmutablearray,Sprite Kit,我正在做一个游戏,它有50个关卡。我想在完成之前的关卡后解锁每个关卡。现在我设置了50个SKSpriteNodes标记为1到50,所以它们是编号级别。我希望NSUserDefaults在关卡完成时告诉关卡选择屏幕,用户已解锁新关卡。(即,如果用户完成级别2,则解锁级别3)。我试图遵循这个问题的解决方案,但它对我不起作用,因为我不确定如何在“级别选择”菜单和当前级别本身中都有一个NSMutableArray 这是我尝试过的一段代码: [[NSUserDefaults standardUserDef

我正在做一个游戏,它有50个关卡。我想在完成之前的关卡后解锁每个关卡。现在我设置了50个
SKSpriteNodes
标记为1到50,所以它们是编号级别。我希望NSUserDefaults在关卡完成时告诉关卡选择屏幕,用户已解锁新关卡。(即,如果用户完成级别2,则解锁级别3)。我试图遵循这个问题的解决方案,但它对我不起作用,因为我不确定如何在“级别选择”菜单和当前级别本身中都有一个
NSMutableArray

这是我尝试过的一段代码:

[[NSUserDefaults standardUserDefaults] setObject:levelAchieved forKey:@"level2"];
[[NSUserDefaults standardUserDefaults] synchronize];
当用户完成级别1时,我使用了此选项

然后我试着称之为:

NSMutableArray *levelAchieved = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"level2"] mutableCopy];
告诉关卡选择场景用户已达到新关卡,并在该场景中解锁该关卡

但这不起作用,因为我无法在两个场景中都使用数组,即使我确保导入了在中实现了
NSMutableArray*level
的头文件


我如何才能正确地添加到数组中,但另外-->这是处理此类问题的正确方法吗?在两个场景之间解锁一系列级别有不同的方法吗?

NSUserDefaults
是一种有效的方法,既可以保存信息,也可以跨多个类访问信息,因此从这个角度看,您的技术没有问题

我要看的是需要存储50个不同的值。如果级别只能按顺序解锁-即,您必须先完成所有级别1-39,然后才能尝试级别40,那么您需要做的就是存储一个表示最高完成级别的NSInteger

e、 g.当你完成38级时,你会做如下事情

NSInteger highLevel=38;
[[NSUserDefaults standardUserDefaults] setInteger:highLevel forKey:@"highLevel"];
第一次运行应用程序时,需要将NSUserDefault值设置为0

如果没有看到您的代码,我无法准确地告诉您下一点,但它会是这样的:

NSInteger highLevel=[[NSUserDefaults standardUserDefaults] integerForKey:@"highLevel"];

for (int i=0;i<NUMBEROFLEVELS;i++)
{
    if (i<=highLevel) {
        // TODO Display unlocked level button
    }
    else {
        // TODO Display locked level button
    }
}
NSInteger highLevel=[[NSUserDefaults standardUserDefaults]IntegerWorkey:@“highLevel”];

对于(int i=0;i是否可以只存储NSUserDefaults中完成的最高级别的NSString,而不是完整的NSMutableArray(或索引值的NSInteger)。因为您只是以顺序模式解锁级别。如果用户完成了级别7之前的所有级别,则只存储级别7(或者objectAtIndex的值为6)。然后在代码中显示数组中的所有对象,直到最高级别completed+1,表示显示级别1到8(也称为索引0到7).

如果级别只能按顺序解锁,那么您只需存储一个NSNumber和达到的最高级别。然后您只需比较级别编号,就像您介意使用NSUserDefaults扩展@paulw11一样,返回的对象始终是不可变的(即使您创建了具有可变对象的存储对象)。如果您需要从NSUserDefaults获取可变数组,请使用类似于[NSMutableArray arrayWithArray:retrievedImmutableArray];的功能。非常感谢。