我正在創建自定義電話簿。 在搜索欄功能中,我需要使用輸入的文本搜索特定的聯繫人。 那麼我應該寫什麼謂詞來過濾從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