UISearchBar теряет фокус

У меня есть UISearchBar для UITableView, и моя реализация выглядит следующим образом:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self.searchBar becomeFirstResponder];
    if(searchText.length == 0)
    {
        self.isFiltered = NO;     
    }
    else
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.writer1 contains[c] %@", searchText];
        self.isFiltered = YES;
        [[RTRepairOrderStore sharedStore] filterROArray:predicate];
    }

    [self.tableView reloadData];    
}

Проблема в том, что после того, как я наберу одну букву в строке поиска, поиск работает, но клавиатура сразу сбрасывается. Как я могу предотвратить это?


person Giardino    schedule 25.09.2014    source источник
comment
вот правильный ответ на этот вопрос: stackoverflow.com/a/25796944/4833705   -  person Lance Samaria    schedule 26.08.2020


Ответы (4)


SearchBar теряет фокус, потому что он, вероятно, находится в заголовке tableView, а tableView перезагружается.

Вы можете предотвратить это одним из следующих способов:

  • Перемещение searchBar, чтобы он больше не был подвидом tableView. Варианты включают размещение searchBar на панели навигации или в представлении над tableView.

  • Замена reloadData одним из следующих подходов, чтобы избежать перезагрузки заголовка tableView:

    • Используйте reloadSections:withRowAnimation: для перезагрузки раздела таблицы или

    • Используйте beginUpdates endUpdates для анимации изменений для вставки или удаления определенных строк.

person Community    schedule 25.10.2014

Что сработало для меня, так это сделать вызов beFirstResponder после вызова reloadData:

[self.tableView reloadData];
[self.searchBar becomeFirstResponder];

Это работает на iOS 8.1.2, я еще не тестировал его на других версиях.

person Gian Franco Zabarino    schedule 05.01.2015

У меня были те же проблемы, с которыми я столкнулся выше, но по другой причине. Мой UISearchBar находился в ячейке вверху таблицы. При вводе я вызывал перезагрузку UITableView, и это приводило к тому, что панель поиска теряла фокус, потому что ячейка, содержащая панель поиска, перезагружалась.

Решение состояло в том, чтобы перезагрузить только те ячейки, которые мне нужны. Моя панель поиска находилась в разделе 0, а все результаты поиска — в разделе один. Таким образом, такой вызов гарантировал, что будет перезагружен только раздел 1, а панель поиска не потеряет фокус.

NSIndexSet *section1 = [NSIndexSet indexSetWithIndex:1];
[self.tableView reloadSections:section1 withRowAnimation:UITableViewRowAnimationAutomatic];
person Luke Smith    schedule 14.06.2016

Когда вызывается searchBar:textDidChange:, searchBar является FirstResponder. Нет необходимости отправлять ему сообщение becomeFirstResponder.
Более того, вы отправляете becomeFirstResponder в self.searchBar, что может не совпадать с searchBar, переданным вам во время вызова метода searchBar:textDidChange:.
Предлагаю удалить [self.searchBar becomeFirstResponder]; и проверить, действительно ли ваше свойство self.searchBar связано с объектом searchBar в обратном вызове searchBar:textDidChange:.

person Reinhard Männer    schedule 25.09.2014