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