我有一个奇怪的问题。我正在创建一个降临节日历,作为圣诞节更新的一部分,并且我试图阻止两次同时获得相同的奖品(奖品在应用程序的其他地方使用)。
奖品列表存储在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正在didFinishLaunching的app委托中初始化,如果它不存在并在退出时存储在NSUserDefaults中。这个函数在单例类中。
当再次运行该函数时出现奇怪的情况NSArray不再是NSArray,NSDictionary不再是字典而且奖品不再是奖品!它们都被初始化为随机Cocos2d对象。因此,奖品可以多次添加。
基本上帮助!
更新
此字符仅出现在iOS6中,今天早上在iOS 5测试设备上进行了测试,它按预期工作。
答案 0 :(得分: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;
奇怪的行为仍然存在,但它不再是一个问题,所以我现在继续前进,但知道为什么这些对象看起来是错误的类会很好。