Двойное касание 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 методы, чтобы сделать это, но я не смог найти подходящий хук для переопределения текущего поведения.

Другие вопросы по тегам