3

ABRecordRef アイテムを NSMutableArray に追加しようとしています。(_bridge id) を使用して C TypeDef を Objective-C id タイプにキャストする必要があることを知りました。したがって、配列に新しいアイテムを追加する前に、オブジェクトが既に配列にあるかどうかを確認したいと思います。そのため、[nsmutablearray containsObject] を使用してみましたが、機能していないようです。重複したアイテムは引き続き配列に追加されます。ここで何が問題なのか知っていますか?

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    if (![_buddiesList containsObject:(__bridge id)person]) {
        [_buddiesList addObject:(__bridge id)person];
        NSLog(@"Added");
    }
    return NO;
}
4

3 に答える 3

4

NSに相当するものはなくABRecordRef、そのすべてのオブジェクトを-containsObject:呼び出し-isEqual:て、重複が既に含まれているかどうかを判断するだけなので、アプローチは機能しません。

ラッパー クラスを作成し、そこに独自のメソッドABRecordRefを実装することをお勧めします。-isEqual:

更新:
@omz が指摘したように、それ機能しCFEqual()ます。ただし、ABRecordRef の周りにラッパー クラスを使用することは、依然として良い考えです。

于 2013-01-16T18:44:47.470 に答える
2

containsObject:呼び出しが重複の報告に失敗する理由は、メソッドをNSArray使用して等しいかどうかを判断するためであり、 などの CF タイプにはこのメソッドがありません。平等を判断するためのより良い方法を見つける必要があります。NSObject-isEqual:ABRecordRef

これを行う最も効率的な方法は、AddressBook API の周りに Objective-C ラッパーを使用して、各レコードを単にブリッジキャストするのではなく、真正なものに変換することです。 Jim Dovey の iPhoneContacts プロジェクトは、これに対する適切なソリューションです。この上に等価性テスト メソッドを構築するには、レコード ID を比較するために以下に示す手法を使用するメソッドを追加するだけです。NSObjectisEqual:

または、そのままにしておくこともできますが、レコードを追加するたびに配列に対して線形スキャンを実行します。このようなもの:

BOOL foundMatch = NO;
for(id buddy in self.buddiesList)
{
    if(ABRecordGetRecordID(buddy) == ABRecordGetRecordID(person))
    {
        foundMatch = YES;
        break;
    }
}
于 2013-01-16T18:51:40.697 に答える
-1

isKindOfClass に対して配列オブジェクトをチェックしてみてください。

例えば:

if ([[ buddiesList objectAtIndex:i] isKindOfClass: ( _bridge id)person]) {

いくつかのことをします。

}

于 2013-01-16T19:07:42.177 に答える