2013-02-13 3 views
4

Я использую этот код для поиска через UITableView:Поиск табличное с UISearchBar

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 



if(searchText.length == 0) 
{ 
    isFiltered = FALSE; 
} 
else 
{ 
    isFiltered = TRUE; 


    if (filteredTableData == nil) 
     filteredTableData = [[NSMutableArray alloc] init]; 
    else 
     [filteredTableData removeAllObjects]; 

    for (NSString* string in self.itemArray) 
    { 
     NSRange nameRange = [string rangeOfString:searchBar.text options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]; 
     if(nameRange.location != NSNotFound) 
     { 
      [filteredTableData addObject:string]; 
     } 
    } 
} 
[tableView reloadData]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 
} 

Все отлично работает, но если нажать на кнопку отмены, которая появляется, когда я начала редактирования, мой список не вернуться, но результаты поиска остаются. Чтобы отобразить список, я должен начать вводить текст, даже один символ в панели поиска, а затем удалить его или нажать «x», чтобы просмотреть весь список. Есть ли способ заблокировать кнопку отмены? Или показать список при нажатии?

+0

Ваш код выглядит правильно. Вероятно, проблема заключается в том, что методы 'UITableViewDataSource' неправильно обрабатывают случай, когда фильтрация переходит из' TRUE' в 'FALSE' (в obj-c вы должны использовать' YES' и 'NO'). Кроме того, вы не должны вызывать 'reloadData' и' reloadSections: ', вам нужно только позвонить. –

+0

Если 'isFiltered' и' filterTableData' являются переменными-членами, принято префикс их с подчеркиванием '_' – nielsbot

+0

' self.isFiltered = searchText.length> 0; self.tableData = self.isFiltered? [self.itemArray filterArrayUsingPredicate: [NSPredicate predicateWithFormat: @ "SELF содержит [cd]% @", searchBar.text]]: self.itemArray; ' – nielsbot

ответ

7

Реализовать - (Недействительными) searchBarCancelButtonClicked: (UISearchBar *) SearchBar метод делегата от UISearchBar. В этом случае добавьте все объекты (начальные объекты в таблице) в файле filterTableData и перезагрузите таблицу.

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
    {  
     [filteredTableData removeAllObjects]; 
     [filteredTableData addObjectsFromArray:self.itemArray]; 
     [tableView reloadData]; 
    } 

Также вам не нужно поддерживать флаг isFiltered, если вы используете его для выбора исходного массива данных для перезагрузки таблицы (в методах таблицы представления источника данных). например

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(isFiltered) 
     return filteredTableData.count 
    else 
     return self.itemArray.count 
} 

Если вы все время сохраняете данные в файле filterTableData, вам не нужно это делать. Ваш метод будет выглядеть как-

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
     return filteredTableData.count 
} 

Первоначально в инициализации или viewDidLoad метода контроллера добавить все объекты в filteredTableData и использовать только этот массив для перезагрузки таблицы.

Таким образом, ваш метод будет выглядеть как-

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if(searchText.length == 0) 
    { 
     [filteredTableData removeAllObjects]; 
     [filteredTableData addObjectsFromArray:self.itemArray]; 
    } 
    else 
    { 
     [filteredTableData removeAllObjects]; 

     for (NSString* string in self.itemArray) 
     { 
      NSRange nameRange = [string rangeOfString:searchBar.text options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]; 
      if(nameRange.location != NSNotFound) 
      { 
       [filteredTableData addObject:string]; 
      } 
     } 
    } 
    [tableView reloadData]; 
    } 
+0

проблема в том, что если я заменил my - (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText с вашим, UISearchBar ничего не ищет. У меня есть свой первоначальный список ... – user2014474

+0

Метод - (void) searchBarCancelButtonClicked: (UISearchBar *) searchBar работает отлично и отвечает на мой вопрос, но я не могу понять, почему вы говорите, что я должен удалить isFiltered – user2014474

+0

Обновленный ответ для вашего запросы –

2

Я не использую этот метод, но использовать следующую команду и она прекрасно работает

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",searchString]; 
    self.filteredCustomers = [[self.customers filteredArrayUsingPredicate:predicate] mutableCopy]; 

    return YES; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    [self.searchDisplayController setActive:NO animated:NO]; 
    self.filteredCustomers = nil; 
    [self.tableView reloadData]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CustomerCell"; 
    NSDictionary *customerObject; 

    CustomerListCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (self.searchDisplayController.active) { 
     customerObject = [[NSDictionary alloc] initWithDictionary:[self.filteredCustomers objectAtIndex:indexPath.row]]; 
    } else { 
     customerObject = [[NSDictionary alloc] initWithDictionary:[[self.customerData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]]; 
    } 
    cell.textLabel.text = [customerObject objectForKey:@"name"]; 
    cell.customerName = [customerObject objectForKey:@"name"]; 
    cell.customerId = [customerObject objectForKey:@"customer_id"]; 

    return cell; 
} 
Смежные вопросы