UITableView / UISearchBar возвращает неверные результаты - PullRequest
0 голосов
/ 08 марта 2011

Я пытаюсь реализовать поиск в 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];
        }
    }
}

}

Ответы [ 2 ]

1 голос
/ 22 ноября 2012

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

0 голосов
/ 08 марта 2011

используйте 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];

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

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