2011-05-01 104 views
15

我已经联系了每个联系人都是字典的数组。搜索NSArictionary对象的NSArray

每个联系人都有一个关键字“contact_type”,它是一个NSNumber。联系方式基本上代表了它的Facebook,LinkedIn或邮件联系等。 我有一个搜索数组,其中只包含NSNumber的contact_type's。

我想要的是使用我的搜索数组进行搜索的临时数组。

我在使用NSPredicate创建搜索联系人数组时遇到了麻烦。有人能指导我如何做到吗?

回答

37
NSArray *contacts = ...; //your array of NSDictionary objects 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"contact_type = 42"]; 

NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter]; 

在此之后,filteredContacts将只包含那些contact_type42接触。

如果你需要搜索超过1种contact_type,然后只需在谓语使用OR

filter = [NSPredicate predicateWithFormat:@"contact_type = 42 OR contact_type = 23"]; 
+0

嗨,谢谢你的回复。但我正在寻找多个联系人类型的搜索....我找到了解决方案。 – Satyam 2011-05-01 04:23:40

+0

@Satyam svv:我刚更新了我的答案。 – 2011-05-01 04:25:28

+0

再次感谢。我发布了与您的解决方案类似的解决方案,但我正在寻找更精确的解决方案。 – Satyam 2011-05-01 04:26:31

1

该解决方案的工作凉我。

// 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 
0

戴夫上面的回答是完美的,我只是在这里加入了我花了3个小时的夜间睡眠后所学到的。

当你试图对数组哟需要使用谓词是这样的字典中搜索字符串值:

NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]]; 

不要忘了“”包装你的价值观,这是唯一的事情,花费我所有的时间。这里是我最后的搜索功能

-(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]; 
}