Скрыть клавиатуру при потере фокуса с UISearchBar

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

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

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

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

    [searchBar resignFirstResponder];

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

Любые идеи?


person rein    schedule 20.05.2009    source источник
comment
Проверьте это: stackoverflow.com/ questions / 7482266 /   -  person alternatiph    schedule 08.11.2014


Ответы (7)


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

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [searchBar resignFirstResponder];

}

Это сработало для меня

person H Vargas    schedule 04.12.2009

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

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

person Enzo Tran    schedule 05.01.2012

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

person Isaac Waller    schedule 20.05.2009
comment
Это потребует нажатия кнопки поиска, чтобы удалить клавиатуру - шаг, который, как мне кажется, не нужен и может просто расстроить пользователей. Спасибо хоть. - person rein; 20.05.2009

Поскольку результаты будут в виде таблицы, используйте метод - (void)scrollViewDidScroll:(UIScrollView *)scrollView делегата UIScrollView (на который отвечает UITableView).

Вам нужно, чтобы ваш контроллер представления отвечал на источник данных и делегат UITableView (в файле .h):

<UITableViewDataSource, UITableViewDelegate>

Затем в вашем методе инициализации в файле .m добавьте:

self.tableView.dataSource = self;
self.tableView.delegate = self;

Наконец, добавьте этот метод:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self.view endEditing:YES];
}

Это заставит UISearchBar потерять фокус и клавиатура скроется.

person nikolovski    schedule 19.07.2013

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

В документации Apple говорится следующее:

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

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

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

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

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

person Nostradani    schedule 08.05.2014

Может быть, очень поздно ответить, но это может помочь кому-нибудь в будущем. Этот конкретный фрагмент кода работал у меня. P.S. Я не владею этим решением, которое я нашел некоторое время назад в самой сети.

-(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];
}
person treatheat    schedule 19.07.2013

Для представления с переменной 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)
}
person Jano    schedule 17.03.2017