Скрыть клавиатуру при потере фокуса с 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)


arrow_upward
10
arrow_downward

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

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [searchBar resignFirstResponder];

}

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

person H Vargas    schedule 04.12.2009

arrow_upward
2
arrow_downward

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

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

person Enzo Tran    schedule 05.01.2012

arrow_upward
1
arrow_downward

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

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

arrow_upward
1
arrow_downward

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

arrow_upward
1
arrow_downward

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

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

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

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

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

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

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

person Nostradani    schedule 08.05.2014

arrow_upward
0
arrow_downward

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

arrow_upward
0
arrow_downward

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