2011-03-08 3 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]; 
} 

Теперь вам нужно изменить l'Л.Л. немного ваш вид таблицы делегат и источник данных, .... для всех мест, где вы используете

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

использовать следующую

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

Спасибо. Я взгляну. – voodoobilly

1

[tableView isEqual:self.searchDisplayController.searchResultsTableView] также является другой альтернативой созданию и управлению вашим собственным BOOL isFiltering; переменной

Смежные вопросы