Я использую этот код для поиска через 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», чтобы просмотреть весь список. Есть ли способ заблокировать кнопку отмены? Или показать список при нажатии?
Ваш код выглядит правильно. Вероятно, проблема заключается в том, что методы 'UITableViewDataSource' неправильно обрабатывают случай, когда фильтрация переходит из' TRUE' в 'FALSE' (в obj-c вы должны использовать' YES' и 'NO'). Кроме того, вы не должны вызывать 'reloadData' и' reloadSections: ', вам нужно только позвонить. –
Если 'isFiltered' и' filterTableData' являются переменными-членами, принято префикс их с подчеркиванием '_' – nielsbot
' self.isFiltered = searchText.length> 0; self.tableData = self.isFiltered? [self.itemArray filterArrayUsingPredicate: [NSPredicate predicateWithFormat: @ "SELF содержит [cd]% @", searchBar.text]]: self.itemArray; ' – nielsbot