Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: reinОтветов: 7

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

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

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

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

    [searchBar resignFirstResponder];

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

Любые идеи?

  • Проверьте это: stackoverflow.com/ questions / 7482266 / alternatiph 08.11.2014

iphonecocoa-touch

Ответы

Ответ 1 · рейтинг 10 · H Vargas

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

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [searchBar resignFirstResponder];

}

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

Ответ 2 · рейтинг 2 · Enzo Tran

Я думаю, что самый простой (и лучший) способ сделать это - создать подкласс вашего глобального представления и использовать метод 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 добавьте:

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

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

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

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

Ответ 5 · рейтинг 1 · Nostradani

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

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

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

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

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

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

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

Ответ 6 · treatheat

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

Ответ 7 · Jano

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы