Ответ 1
Попробуйте следующее:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[searchBar resignFirstResponder];
}
Это сработало для меня
Я не уверен, почему это так сложно. У меня есть UISearchBar в верхней части моей страницы. Когда пользователь вводит этот UISearchBar, он автоматически фильтрует результаты в UITableView, который находится ниже строки поиска. Нет необходимости в кнопке поиска, поскольку я ищу, когда нажаты клавиши.
Поток приложения заключается в том, что пользователь вводит поиск в строке поиска (с отображаемой клавиатурой), а затем прокручивает результаты в представлении таблицы - в этот момент клавиатура должна исчезнуть.
Мне сложно сменить клавиатуру.
Я знаю, что мне нужно сделать:
[searchBar resignFirstResponder];
чтобы клавиатура исчезла, но я не могу найти, какой делегат мне нужно выполнить. Я хочу сделать это, как только пользователь коснется табличного представления.
Любые идеи?
Попробуйте следующее:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[searchBar resignFirstResponder];
}
Это сработало для меня
Я думаю, что самый простой (и лучший) способ сделать это - подклассировать глобальное представление и использовать метод hitTest: withEvent для прослушивания любого касания. Прикосновения на клавиатуре не регистрируются, поэтому hitTest: withEvent вызывается только при касании/прокрутке/прокрутке/ущемлении... в другом месте, затем вызовите [self endEditing: YES].
Это лучше, чем использование touchhesBegan, потому что touchsBegan не вызывается, если вы нажмете кнопку над представлением. Это также лучше, чем использование тусклого экрана, потому что в сложном и динамическом пользовательском интерфейсе вы не можете помещать тусклый экран где угодно. Кроме того, это лучше, чем вызов [searchBar resignFirstResponder], потому что на экране может быть много текстовых полей, поэтому это работает для всех.
Возможно, вы захотите сделать это, как это делает Cydia (интерфейс Jailbroken package UI) - есть кнопка поиска, и когда вы нажимаете кнопку поиска, она закрывает клавиатуру. Результаты будут отфильтрованы по мере ввода для предварительного просмотра.
Поскольку результаты будут отображаться в виде таблицы, используйте UIScrollView
delegate (которому отвечает UITableView
) метод - (void)scrollViewDidScroll:(UIScrollView *)scrollView
.
Вам нужно, чтобы ваш контроллер представления отвечал на источник данных и делегат UITableView
(в файле .h
):
<UITableViewDataSource, UITableViewDelegate>
Чем ваш метод инициализации в файле .m
добавит:
self.tableView.dataSource = self;
self.tableView.delegate = self;
Наконец, добавьте этот метод:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self.view endEditing:YES];
}
Это приведет к потере фокуса UISearchBar
, и клавиатура скроется.
Одна из возможностей заключается в том, что UISearchBar принадлежит контроллеру, который отображается в UIModalPresentationFormSheet. У меня была та же проблема и выяснилось, что это связано с методом "disablesAutomaticKeyboardDismissal" UIViewController.
В документации Apple указано следующее:
Отменить этот метод в подклассе, чтобы разрешить или запретить увольнение текущего вида ввода (обычно это системная клавиатура) при изменении из элемента управления, который хочет, чтобы входной вид был таким, который нет. Под когда пользователь удаляет элемент управления, который требует ввода, система автоматически отображает это представление. Нажатие в который не хочет, чтобы входное представление впоследствии вызывало текущее представление ввода должно быть отклонено, но не во всех случаях. Ты можешь переопределите этот метод в этих невыясненных случаях, чтобы разрешить ввод просмотр для отклонения или использование этого метода, чтобы предотвратить представление уволен в других случаях.
По умолчанию этот метод возвращает YES, когда модальная стиль презентации контроллера просмотра установлен на UIModalPresentationFormSheet и возвращает NO для другой презентации стили. Таким образом, система обычно не позволяет клавиатуре уволен за модальные формы.
В моем случае я отобразил строку поиска в панели навигации, поэтому мне пришлось создать подкласс UINavigationViewController, который переопределяет метод следующим образом:
- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}
После этого resignFirstResponder, наконец, заставит клавиатуру исчезнуть.
Возможно, поздно поздно ответить, но это может помочь кому-то в будущем. Этот фрагмент кода работал у меня. Постскриптум У меня нет этого решения, которое было найдено некоторое время назад в самой сети.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
if ([self.srchBar isFirstResponder] && [touch view] != self.srchBar)
{
[self.srchBar resignFirstResponder];
}
[super touchesBegan:touches withEvent:event];
}
Учитывая представление с переменной searchBar
, добавьте этот метод в представление:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
{
if searchBar.isFirstResponder && !searchBar.point(inside: point, with: event){
searchBar.resignFirstResponder()
}
return super.hitTest(point, with: event)
}