我正在创建自定义电话簿。 在搜索栏功能中,我需要使用输入的文本搜索特定的联系人。 那么我应该写什么谓词来过滤从ABrecord类型的地址簿数组中的数组? 它应该是名称以“text”开头的东西使用NSPredicate for iOS搜索ABAddressBook的联系人姓名
回答
你可以这样做:
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
的开销。但我不相信苹果曾经发布过密钥,可以与ABRecordRef
阵列一起使用,您可以自己与predicateWithFormat
一起使用。
如果你只是想搜索的名称,你也可以使用ABAddressBookCopyPeopleWithName
,从而消除了谓词共需要:
NSArray *searchResults = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, (__bridge CFStringRef)searchTerm));
为什么wana使用NSPredicate? ...看看这个链接,如果它是helpful!
此链接是不开放..想用nspredicate为更快的搜索。我有5000多个联系人 – Sambhav 2014-11-04 11:53:17
通过URL判断,我认为这是[预期的链接](https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AddressBook/Tasks/Searching.html#//apple_ref/DOC/UID/20001024-BABHHIHC)。不幸的是,这是为Mac OS地址簿框架,而不是iOS框架(这是不同的)。 – Rob 2014-11-04 13:44:07
- 1. 使用联系人姓名和号码的搜索过滤器
- 2. 在搜索ABAddressBook时,如何在排除职位的同时搜索联系人姓名?
- 3. 搜索ABAddressbook iOS SDK
- 4. iOS:尝试使用ABAddressBook导入联系人时崩溃
- 5. 如何从联系人编号中读取联系人姓名?
- 6. 亚行通过其联系人姓名
- 7. ABAddressBook已筛选的联系人
- 8. 如何从iOS中的联系人中提取姓名?
- 9. 使用COM搜索Outlook联系人?
- 10. 显示联系人姓名(重复姓名取决于联系人号码存在的名称)
- 11. 从号码获取联系人姓名
- 12. 获取联系人姓名addess
- 13. 检索所有类似联系人姓名的号码
- 14. 优化ContentProvider的查询检索联系人姓名和电话
- 15. 获取姓名缩写联系人姓名
- 16. 联系人姓名检索返回“Skype的视频通话”
- 17. 如何在iOS上通过联系人姓名拨打电话?
- 18. 根据联系人姓名获取sectionIndex标题
- 19. 我想要删除iOS中使用ABaddressbook与Objective C的联系人号码?
- 20. 联系人选择器,检索姓氏,名字,电话号码
- 21. 如何使用Lucene进行个人姓名(名字,姓氏)搜索?
- 22. 如何从来电号码中检索联系人姓名?
- 23. 从联系人应用程序获取子女姓名(关系)
- 24. 如何检索ABAddressBook所有联系人没有重复
- 25. 如何获得联系人姓名信息的特定联系人
- 26. 如何在Android 2.1中使用联系人姓名填充AutoCompleteTextView
- 27. 从电话簿获取联系人姓名使用号码 - Android
- 28. Android:使用电话号码获取联系人姓名
- 29. android使用SimpleCursorAdapter获取联系人姓名和号码
- 30. 如何从Windows Phone 7的联系人列表中检索联系人的姓名及其号码?
谢谢你也会试试这个.........并且会在这里更新,如果有什么对我有用的话 – Sambhav 2014-11-04 13:05:03