如何使用 NSUserDefaults 将项目添加到 NSMutableArray

Posted

技术标签:

【中文标题】如何使用 NSUserDefaults 将项目添加到 NSMutableArray【英文标题】:How to add items to an NSMutableArray with NSUserDefaults 【发布时间】:2014-05-01 03:28:43 【问题描述】:

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

这是我尝试过的代码:

[[NSUserDefaults standardUserDefaults] setObject:levelAchieved forKey:@"level2"];
[[NSUserDefaults standardUserDefaults] synchronize];

我在用户完成第 1 关时使用了这个

然后我尝试调用这个:

NSMutableArray *levelAchieved = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"level2"] mutableCopy];

告诉关卡选择场景用户已经达到了一个新的关卡并在该场景中解锁。

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

我怎样才能正确地添加到数组中,但此外 --> 这是处理这类事情的正确方法吗?是否有不同的方式来解锁 2 个场景之间的一系列关卡?

【问题讨论】:

如果关卡只能按顺序解锁,那么您只需要存储一个具有***别的 NSNumber。然后您可以将级别编号比较为 你介意扩展@Paulw11 使用 NSUserDefaults,返回的对象始终是不可变的(即使您使用可变对象创建了存储对象)。如果您需要从 NSUserDefaults 获取可变数组,请使用类似 [NSMutableArray arrayWithArray:retrievedImmutableArray]; 【参考方案1】:

NSUserDefaults 是持久化信息和跨多个类访问信息的有效方式,因此从这个角度来看,您的技术没有任何问题。

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

例如当你完成 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
    

请注意,将 highLevel 设置为 0 实际上会解锁级别 1,因为数组的第一个元素实际上是 0。当 highLevel 为 1 时,元素 0 和 1(级别 1 和 2)被解锁,依此类推...

【讨论】:

工作就像一个魅力。非常感谢。【参考方案2】:

是否可以只存储在 NSUserDefaults 中完成的***别的 NSString 而不是完整的 NSMutableArray(或索引值的 NSInteger)。因为您只是按顺序解锁关卡。如果用户完成了所有级别,直到级别 7,那么您只需存储级别 7(或 objectAtIndex 的值为 6)。然后在您的代码中显示数组中的所有对象,直到***别已完成 + 1,这意味着显示级别 1 到 8(也就是索引 0 到 7)。

【讨论】:

以上是关于如何使用 NSUserDefaults 将项目添加到 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章

让 tableView 从 NSUserDefaults 中删除滑动删除项目 - 如何将这两个功能结合在一起?

如何使用自定义数据模型将 NSMutableArray 正确传递给 NSUserDefaults?

将图像添加到 NSUserDefaults 和文件夹

将字符串保存到 NSUserDefaults?

如何在 NSUserDefaults 中绑定 NSDictionary 中的对象?

如何将 MPMediaItemCollection 保存到 NSUSerDefaults?