0

我有一个奇怪的问题。我正在创建一个出现日历作为圣诞节更新的一部分,并试图防止两次解锁相同的奖品(奖品在应用程序的其他地方使用)。

奖品列表存储在 plist 中,因为它似乎是一种快速输入/读取数据的方法。

-(Prize*)getPrizeForDay:(NSInteger)integer
{
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"XmasPresents" ofType:@"plist"];
    NSArray* contentArray = (NSArray*)[NSArray arrayWithContentsOfFile:plistPath];
    NSDictionary* dictionary = (NSDictionary*)[contentArray objectAtIndex:integer-1];

Prize* prize = (Prize*)[Prize prizeWithType:[[dictionary objectForKey:@"ContentId"]intValue] andName:[dictionary objectForKey:@"Name"] andContent:[dictionary objectForKey:@"Content"] andAnswer:[dictionary objectForKey:@"Answer"]];

if(![self.calendarPrizes containsObject:prize])
[self.calendarPrizes addObject:prize];
else
    prize.unlocked = YES;

return prize;

}

如果 self.calendarPrizes 不存在并在退出时存储在 NSUserDefaults 中,则会在 didFinishLaunching 上的应用程序委托中初始化 self.calendarPrizes。此函数在单例类中。

再次运行函数时出现奇怪的 NSArray 不再是 NSArray, NSDictionary 不再是字典, Prize 不再是奖品!!!它们都被初始化为随机的 Cocos2d 对象。因此,可以多次添加奖品。

基本上帮助!

更新

此字符仅出现在 iOS6 中,今天早上在 iOS 5 测试设备上进行了测试,它按预期工作。

4

1 回答 1

0

所以我发现 [NSArray containsObject:] 不适用于自定义对象。您要么必须覆盖 NSObject 上的 isEqual 方法,要么使用谓词(我选择了后者)。

 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name == %@",prize.name];
NSArray* predicateArray = [self.calendarPrizes filteredArrayUsingPredicate:predicate];

if(predicateArray.count > 0)
{
    prize.unlocked = YES;
}
else
{
    [self.calendarPrizes addObject:prize];
}

return prize;

奇怪的行为仍然存在,但它不再是一个问题,所以我现在继续前进,但很高兴知道为什么这些对象显示为错误的类。

于 2012-11-01T11:23:07.103 回答