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使用该NSObject方法-isEqual:来确定相等性,而 CF 类型如ABRecordRef没有此方法。我们需要找到一种更好的方法来确定平等。

最有效的方法是在 AddressBook API 周围使用 Objective-C 包装器,将每条记录转换为真正的 NSObject记录,而不仅仅是桥接转换它。Jim Dovey 的 iPhoneContacts 项目是一个很好的解决方案。要在此之上构建一个相等性测试方法,只需添加一个isEqual:使用下面显示的技术来比较记录 ID 的方法。

或者,您可以保持原样,但每次要添加记录时对数组进行线性扫描。像这样的东西:

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 回答