Скрыть клавиатуру при потере фокуса с UISearchBar - PullRequest
15 голосов
/ 20 мая 2009

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

Процесс приложения заключается в том, что пользователь вводит поиск в строке поиска (с отображаемой клавиатурой), а затем прокручивает результаты в виде таблицы - в этот момент клавиатура должна исчезнуть.

Мне трудно заставить клавиатуру исчезнуть.

Я знаю, что мне нужно сделать:

    [searchBar resignFirstResponder];

чтобы клавиатура исчезла, но я не могу найти делегата, для которого мне нужно это выполнить. Я хочу сделать это, как только пользователь коснется табличного представления.

Есть идеи?

Ответы [ 7 ]

10 голосов
/ 04 декабря 2009

Попробуйте это:

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [searchBar resignFirstResponder];

}

у меня сработало

2 голосов
/ 05 января 2012

Я думаю, что самый простой (и лучший) способ сделать это - создать подкласс вашего глобального представления и использовать метод hitTest: withEvent для прослушивания любого прикосновения. Касания на клавиатуре не зарегистрированы, поэтому hitTest: withEvent вызывается только когда вы касаетесь / прокручиваете / проводите / зажимаете ... где-то еще, затем вызываете [self endEditing: YES].

Это лучше, чем использовать touchesBegan, потому что touchesBegan не вызывается, если вы нажмете кнопку в верхней части представления. Это также лучше, чем использование тусклого экрана, потому что в сложном и динамичном пользовательском интерфейсе вы не можете ставить тусклый экран везде, где только можно. Кроме того, это лучше, чем вызов [searchBar resignFirstResponder], потому что у вас может быть много текстовых полей на экране, так что это работает для всех из них.

1 голос
/ 08 мая 2014

Одна возможность состоит в том, что UISearchBar принадлежит контроллеру, который отображается в UIModalPresentationFormSheet. У меня была такая же проблема, и я обнаружил, что это связано с методом «disablesAutomaticKeyboardDismissal» UIViewController.

В документации Apple указано следующее:

Переопределите этот метод в подклассе, чтобы разрешить или запретить увольнение. текущего вида ввода (обычно системной клавиатуры) при изменении от элемента управления, который хочет, чтобы входное представление не соответствует. Под нормальные обстоятельства, когда пользователь касается элемента управления, который требует входное представление, система автоматически отображает это представление. Выстукивать в элемент управления, который не хочет, чтобы представление ввода впоследствии вызывало текущий вид ввода должен быть отклонен, но не во всех случаях. Вы можете переопределите этот метод в тех нерешенных случаях, чтобы разрешить ввод представление должно быть отклонено или использовать этот метод, чтобы предотвратить представление уволен в других случаях.

Реализация по умолчанию этого метода возвращает YES, когда модальное стиль представления контроллера представления установлен на UIModalPresentationFormSheet и возвращает NO для другой презентации стили. Таким образом, система обычно не позволяет клавиатуре быть уволен за модальные формы.

В моем случае я отобразил панель поиска на панели навигации, поэтому мне пришлось создать подкласс UINavigationViewController, который переопределяет метод следующим образом:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

После этого resignFirstResponder, наконец, заставит клавиатуру исчезнуть.

1 голос
/ 19 июля 2013

Поскольку результаты будут представлены в виде таблицы, используйте метод делегата UIScrollView (на который отвечает 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, и клавиатура скроется.

1 голос
/ 20 мая 2009

Возможно, вы захотите сделать это так, как это делает Cydia (пользовательский интерфейс упаковки с джейлбрейком) - есть кнопка поиска, а когда вы нажимаете кнопку поиска, она закрывает клавиатуру. Результаты по-прежнему фильтруются при вводе для предварительного просмотра.

0 голосов
/ 17 марта 2017

Учитывая представление с переменной 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)
}
0 голосов
/ 19 июля 2013

Возможно, будет слишком поздно, чтобы ответить, но это может помочь любому в будущем. Этот конкретный кусок кода работал для меня. Постскриптум Мне не принадлежит это решение, найденное некоторое время назад в самой сети.

-(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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...