2011-05-01 115 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]; 
}