2014-09-25 3 views
2

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

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

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

ответ

0

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

4

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

Вы можете предотвратить это либо:

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

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

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

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

2

То, что сработало для меня, чтобы сделать вызов becomeFirstResponder произойдет после reloadData одного:

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

Это работает на прошивке 8.1.2, я не проверял его на другие версии.

0

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

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

NSIndexSet *section1 = [NSIndexSet indexSetWithIndex:1]; 
[self.tableView reloadSections:section1 withRowAnimation:UITableViewRowAnimationAutomatic]; 
Смежные вопросы