搜索NSDray对象的NSArray

时间:2011-05-01 03:43:42

标签: ios nsarray nsdictionary nspredicate

我是联系人数组,其中每个联系人都是字典。

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

我想要的是制作一个临时的联系人数组,我想用我的搜索数据搜索。

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

3 个答案:

答案 0 :(得分:37)

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

NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];

在此之后,filteredContacts将仅包含contact_type42的联系人。

如果您需要搜索多种contact_type,只需在谓词中使用OR

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

答案 1 :(得分: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

答案 2 :(得分: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];
}