2011-03-08 133 views
0

我試圖在UITableView中實現搜索。搜索時,看起來返回了正確的結果數量,但我正在從結果中的原始故事數組接收條目,而不是searchResults。我可以看到searchResults數組應該是數據源,但是經過大量的搜索之後,仍然無法弄清楚如何使用NSDictionaries來實現它。任何幫助表示讚賞。UITableView/UISearchBar返回不正確的結果

- (void)handleSearchForTerm:(NSString *)searchTerm { 
[self setSavedSearchTerm:searchTerm]; 

if ([self searchResults] == nil) 
{ 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    [self setSearchResults:array]; 
    [array release], array = nil; 
} 

[[self searchResults] removeAllObjects];  

if ([[self savedSearchTerm] length] != 0) 
{ 

    for (NSDictionary *currentItem in [self stories]) 
    { 
     if ([[currentItem objectForKey:@"title"] rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound) 
     { 
      [[self searchResults] addObject:currentItem]; 
     } 
    } 
} 

}

回答

0

使用NSPredicate用於過濾

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self.title MATCHES %@",searchTerm]; 

假設你原來的數組是 「originalArray」,因此要得到過濾陣列使用使兩個全局變量

NSArray* filteredArray; 
BOOL isFiltering; 

現在在搜索欄中委託方法做如下

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
     NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self.title MATCHES %@",searchTerm]; 
     filteredArray = [[originalArray filteredArrayUsingPredicate:predicate] retain]; 
} 

現在,你需要你在哪裏使用

NSDictionary *currentString = [originalArray objectAtIndex:indexPath.row]; 

使用下面的方法修改L'LL位的表視圖委託和數據源,爲......所有的地方

NSDictionary *currentString; 
if(isFiltering) 
     currentString = [originalArray objectAtIndex:indexPath.row]; 
else 
     currentString = [filteredArray objectAtIndex:indexPath.row]; 
+0

謝謝。我會看一看。 – voodoobilly 2011-03-08 14:17:05

1

[tableView isEqual:self.searchDisplayController.searchResultsTableView]也是製作和管理自己的另一種替代品BOOL isFiltering;變量