Двойное касание UISearchBar с делегатом поиска на iOS 7 приводит к исчезновению UISearchBar
У нас есть строка поиска в заголовке таблицы. Когда пользователь нажимает на него дважды быстро на iOS 7, он исчезает. У кого-нибудь есть предложения, что мы делаем не так?
2 ответа
После многих проб и ошибок я обнаружил, что когда searchDisplayController заканчивает поиск, панель поиска исчезает, поэтому я снова вставил панель поиска в заголовок таблицы, и она сработала для меня.
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
self.searchingFetchedResultsController = nil;
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
[self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
}
return;
}
Надеюсь это поможет.
(Я отправил этот же ответ в Troubles with UISearchBar \ UISearchDisplayViewController, который выглядит как дубликат этого вопроса.)
Я столкнулся с той же проблемой, и заметил, что searchDisplayControllerDidEndSearch
звонили дважды. Первый раз, супервьюз self.searchDisplayController.searchBar
это UITableView
и во второй раз это все еще UIView
,
С ответом Прии я беспокоюсь о непреднамеренных последствиях или ненужных накладных расходах от повторной вставки подпредставления каждый раз, когда дважды ударяется панель поиска, и я также беспокоюсь о том, что она сломается в будущих версиях iOS. К счастью, мы можем воспользоваться странностью супервизии, например так:
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
if (self.tableView != self.searchDisplayController.searchBar.superview) {
[self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
}
}
Если бы мне пришлось угадывать, что происходит, UISearchBar
автоматически создает временный UIView
как его супервизор, когда он активен - это вид, видимый при выполнении поиска. В то время как UISearchBar
увольняется, супервизия возвращается UITableView
раньше, если только он не был отклонен так быстро, что он никогда не был должным образом инициализирован, в этом случае он очищается ненадлежащим образом и UITableView
никогда не получает UISearchBar
назад как его ребенок.
Это решение все еще не идеально, и я думаю, что Apple, должно быть, делает что-то другое в своих собственных приложениях, потому что их панель поиска UX выглядит немного лучше. Я думаю, что было бы лучше не обрабатывать второй кран в первую очередь, пока UISearchBar
был готов. Я пытался использовать другой UISearchBarDelegate
методы, чтобы сделать это, но я не смог найти подходящий хук для переопределения текущего поведения.