0

奇妙な質問があります。クリスマスのアップデートの一環としてアドベントカレンダーを作成していて、同じ賞品のロックを2回解除しないようにしています(賞品はアプリの他の場所で使用されます)。

賞品リストは、データをすばやく入力/読み取る方法のように見えたため、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のアプリデリゲートで初期化され、終了時にNSUserDefaultsに保存されます。この関数はシングルトンクラス内にあります。

関数を再度実行すると、NSArrayがNSArrayでなくなり、NSDictionaryが辞書でなくなり、Prizeが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 に答える