从NSUserDefaults获取数组的问题

时间:2014-08-09 16:42:59

标签: objective-c arrays sorting cocos2d-iphone nsuserdefaults

我正在使用cocos2d-iphone制作游戏,并希望制作一个以前最佳分数的屏幕。我有两个场景。在MainScene我创建了一个用于存储分数的全局变量,这在游戏中显然正在发生变化;一个可变数组和一个简单数组,它们将是可变数组的重复数组:

    NSInteger _scoreValue;
    NSMutableArray *_scoresMutable;
    NSArray *_scores;

在同一个班级中,当游戏结束时,我会在可变数组中添加新分数,制作静态副本并将其保存在NSUserDefaults中:

    [_scoresMutable addObject:@(_scoreValue)];
     _scores=[NSArray arrayWithArray:_scoresMutable];
     [[NSUserDefaults standardUserDefaults] setObject:_scores forKey:@"gameScores"];

然后,在其他类别的场景中,得分称为bestscores(我不知道怎么样更好,但我更容易制作一个新场景,因为我使用的是SpriteBuilder)我导入{ {1}}以防万一并制作标签。

目前我正试图从MainScene.h获得所有分数,对其进行排序并显示第二大价值。但它始终显示0(标签默认为空)。那么,如何做到这一点呢?

NSUserDefaults

编辑:- (void)didLoadFromCCB { NSSet *numberSet = [NSSet setWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"gameScores"]]; NSArray *sortedNumbers = [[numberSet allObjects] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO] ]]; NSNumber *secondHighest; if ([sortedNumbers count] > 1){ secondHighest = sortedNumbers[1]; } [_secondBiggestLabel setString:[NSString stringWithFormat:@"%ld",(long)secondHighest]]; } ` 没有帮助。也许我需要写一些其他内容才能从另一个类访问synchronize

2 个答案:

答案 0 :(得分:1)

设置对象时,必须通过调用同步来跟随它。这实际上会保存它。

[[NSUserDefaults standardUserDefaults] synchronize];

答案 1 :(得分:0)

你确定你已经初步化了'_scoresMutable'数组吗?

此外,如果以下部分中的代码是在单独的启动上运行,而不是在运行第一部分代码时运行,则可能在默认值写入磁盘之前终止应用程序。在NSUserDefaults实例上调用'synchronize'来修复它。