使用NSPredicate for iOS从ABAddressBook搜索联系人姓名

时间:2014-11-04 11:23:56

标签: ios nspredicate abaddressbook

我正在创建自定义电话簿。 在搜索栏功能中,我需要使用输入的文本搜索特定联系人。 那么我应该写什么谓词来过滤ABrecord类型的地址簿数组中的数组呢? 它应该是名称以" text"

开头

2 个答案:

答案 0 :(得分:0)

为什么你会使用NSPredicate? ...如果是helpful,请查看此链接!

答案 1 :(得分:0)

您可以执行以下操作:

NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) {
    NSString *firstName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty));
    if (firstName && [firstName rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location == 0)
        return TRUE;

    NSString *lastName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonLastNameProperty));
    if (lastName && [lastName rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location == 0)
        return TRUE;

    // repeat for all of the properties you want to search

    return FALSE;
}];
NSArray *searchResults = [allPeople filteredArrayUsingPredicate:predicate];

注意,如果执行大量这些搜索,并且您想在块内部执行此ABRecordCopyValue,则可以使用您想要的任何键创建自己的自定义对象(或词典)数组,从而执行此操作所有记录的所有字段都ABRecordCopyValue一次,然后您可以重复使用predicateWithFormat自定义对象数组,而不会产生重复执行ABRecordCopyValue的开销。但是我不相信Apple曾经发布了一个可以与ABRecordRef数组一起使用的密钥,您可以自己与predicateWithFormat一起使用。


如果您只想搜索名称,也可以使用ABAddressBookCopyPeopleWithName,这样就完全不需要谓词:

NSArray *searchResults = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, (__bridge CFStringRef)searchTerm));