Не знаю, почему это так сложно. У меня UISearchBar вверху страницы. Когда пользователь вводит в этот UISearchBar, он автоматически фильтрует результаты в UITableView, который находится под панелью поиска. В кнопке поиска нет необходимости, так как я ищу при нажатии клавиш.
Поток приложения заключается в том, что пользователь вводит поиск в строке поиска (с отображаемой клавиатурой), а затем прокручивает результаты в табличном представлении - в этот момент клавиатура должна исчезнуть.
Мне трудно заставить исчезнуть клавиатуру.
Я знаю, что мне нужно сделать:
[searchBar resignFirstResponder];
чтобы клавиатура исчезла, но я не могу найти делегата, с которым мне нужно это сделать. Я хочу сделать это, как только пользователь коснется табличного представления.
Я думаю, что самый простой (и лучший) способ сделать это - создать подкласс вашего глобального представления и использовать метод hitTest: withEvent для прослушивания любого прикосновения. Касания на клавиатуре не регистрируются, поэтому hitTest: withEvent вызывается только тогда, когда вы касаетесь / прокручиваете / проводите пальцем / зажимаете пальцы ... в другом месте, а затем вызываете [self endEditing: YES].
Это лучше, чем использование touchesBegan, потому что touchesBegan не вызывается, если вы нажимаете кнопку в верхней части представления. Это также лучше, чем использование тусклого экрана, потому что в сложном и динамичном пользовательском интерфейсе вы не можете разместить тусклый экран повсюду. Кроме того, это лучше, чем вызывать [searchBar resignFirstResponder], потому что у вас может быть много текстовых полей на экране, так что это работает для всех из них.
Ответ 3 · рейтинг 1 · Isaac Waller
Возможно, вы захотите сделать это, как это делает Cydia (пользовательский интерфейс взломанной упаковки) - есть кнопка поиска, и когда вы нажимаете кнопку поиска, она закрывает клавиатуру. Результаты по-прежнему фильтруются при вводе для предварительного просмотра.
Ответ 4 · рейтинг 1 · nikolovski
Поскольку результаты будут в виде таблицы, используйте метод - (void)scrollViewDidScroll:(UIScrollView *)scrollView делегата UIScrollView (на который отвечает UITableView).
Вам нужно, чтобы ваш контроллер представления отвечал на источник данных и делегат UITableView (в файле .h):
<UITableViewDataSource, UITableViewDelegate>
Затем в вашем методе инициализации в файле .m добавьте:
Это заставит UISearchBar потерять фокус и клавиатура скроется.
Ответ 5 · рейтинг 1 · Nostradani
Одна из возможностей состоит в том, что UISearchBar принадлежит контроллеру, который отображается в UIModalPresentationFormSheet. У меня была такая же проблема, и я обнаружил, что это связано с методом "disablesAutomaticKeyboardDismissal" UIViewController.
Переопределите этот метод в подклассе, чтобы разрешить или запретить отклонение текущего представления ввода (обычно системной клавиатуры) при переходе с элемента управления, которому требуется представление ввода, на другое. В обычных обстоятельствах, когда пользователь касается элемента управления, для которого требуется представление ввода, система автоматически отображает это представление. Нажатие на элемент управления, которому не требуется представление ввода, впоследствии приводит к закрытию текущего представления ввода, но не во всех случаях. Вы можете переопределить этот метод в этих невыполненных случаях, чтобы разрешить отклонение представления ввода, или использовать этот метод, чтобы предотвратить отклонение представления в других случаях.
Реализация этого метода по умолчанию возвращает YES, когда для модального стиля представления контроллера представления установлено значение UIModalPresentationFormSheet, и возвращает NO для других стилей представления. Таким образом, система обычно не позволяет отклонять клавиатуру для модальных форм.
В моем случае я отобразил панель поиска в панели навигации, поэтому мне пришлось создать подкласс UINavigationViewController, который переопределяет метод следующим образом:
После этого resignFirstResponder, наконец, заставит клавиатуру исчезнуть.
Ответ 6 · treatheat
Может быть, очень поздно ответить, но это может помочь кому-нибудь в будущем. Этот конкретный фрагмент кода работал у меня. P.S. Я не владею этим решением, которое я нашел некоторое время назад в самой сети.