[英]Searching NSArray of NSDictionary objects
我有聯系人數組,其中每個聯系人都是字典。
每個聯系人都有一個鍵“contact_type”,它是一個 NSNumber。 聯系人類型基本上代表它是 Facebook、LinkedIn 還是郵件聯系人等。我有一個搜索數組,它只包含 NSNumber 的contact_type。
我想要的是制作一個臨時的聯系人數組,我想使用我的搜索數組進行搜索。
我在使用 NSPredicate 創建搜索聯系人數組時遇到了麻煩。 有人可以指導我怎么做嗎?
NSArray *contacts = ...; //your array of NSDictionary objects
NSPredicate *filter = [NSPredicate predicateWithFormat:@"contact_type = 42"];
NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];
之后, filteredContacts
將只包含contact_type
為42
的聯系人。
如果您需要搜索不止一種contact_type
,那么只需在謂詞中使用OR
:
filter = [NSPredicate predicateWithFormat:@"contact_type = 42 OR contact_type = 23"];
這個解決方案對我來說很酷。
//NSDictionary 格式
{
18=(
{
content="Great Avijit",
id=abc
}
),
13=(
{
content="Stack Overflow is cool",
id=abc
}
),
}
//步驟1
-(void)filterContentForSearchText:(NSString *)searchText
{
[self.filterResultArray removeAllObjects];
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"(content contains[cd] %@)", searchText];//from_user.name
//other
for (NSMutableDictionary *key in self.messageAll) {
NSArray *array=[self.messageAll objectForKey:key];
array=[array filteredArrayUsingPredicate:namePredicate];
if ([array count]==0) {
[self.filterResultArray removeObject:key];
}
else{
if ([self.filterResultArray containsObject:key]) {
}
else{
[self.filterResultArray addObject:key];
}
}
}
//Reload table view
[self.tableView reloadData];
}
//第2步:numberOfRowsInSection
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (self.searchController.active && ![self.searchController.searchBar.text isEqualToString:@""]) {
return [self.filterResultArray count];
}else{
return [keyArray count];//keyArray hold all key of original dict
}
}
//第 3 步:在 cellForRowAtIndexPath 方法中
NSString *key = [self.filterResultArray objectAtIndex:indexPath.row];
NSDictionary *dictionary = [[self.messageAll objectForKey:key] lastObject];//self.messageAll is original dict
上面戴夫的回答是完美的,我只是在這里添加我花了 3 個小時的夜間睡眠后學到的東西。
當您嘗試在數組的字典中搜索字符串值時,您需要使用如下謂詞:
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]];
不要忘記用''包裝你的價值觀,這是唯一讓我付出代價的事情。 這是我最后的搜索 function
-(void)searchTerm : (NSString*)searchText {
if (searchText!=nil && searchText.length) {
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]];
self.reasonDetailArray = [self.unfilteredReasonDetailArray filteredArrayUsingPredicate:filter];
}else{
self.reasonDetailArray = self.unfilteredReasonDetailArray;
}
[self.tableView reloadData];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.