UITableView/UISearchBar возвращает неверные результаты

Я пытаюсь реализовать поиск в UITableView. При поиске кажется, что возвращается правильное количество результатов, но я получаю записи из исходного массива историй в результатах, а не searchResults. Я вижу, что массив searchResults должен быть источником данных, но после множества поисков я не смог понять, как это сделать с помощью массива NSDictionaries. Любая помощь приветствуется.

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

}


person voodoobilly    schedule 08.03.2011    source источник


Ответы (2)


используйте 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'll bit вашего делегата табличного представления и источника данных, .... для всех мест, где вы используете

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

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

NSDictionary *currentString;
if(isFiltering)
      currentString = [originalArray objectAtIndex:indexPath.row];
else
      currentString = [filteredArray objectAtIndex:indexPath.row];
person Amit Singh    schedule 08.03.2011

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

person karmacode    schedule 21.11.2012