Возможно ли получить активный UITextField или UITextView в UIView, поэтому я могу скрыть клавиатуру с помощью [text resignFirstResponder];
?
Как получить текущий активный UITextField/UITextView и resignFirstResponder?
Ответ 1
Как и в случае с iOS 2.0 и более поздними версиями, есть простой способ отклонить клавиатуру, не отследя текущий активный элемент управления или повторить все доступные элементы управления или используя UITextFieldDelegate
.
[self.view endEditing:YES]
Из документов:
endEditing:
Заставляет просмотр (или одно из его встроенных текстовых полей) покинуть статус первого ответчика.
- (BOOL
) endEditing: (BOOL
) forceПараметры
сила
УкажитеYES
, чтобы заставить первого ответчика уйти в отставку, независимо от того, хочет ли он это сделать так.
Возвращаемое значениеYES
, если представление смирило статус первого ответчика илиNO
, если этого не произошло.Обсуждение
Этот метод рассматривает текущий вид и его подпункт иерархии для текстового поля, которое в настоящее время является первым ответчиком. Если он находит один, он просит, чтобы текстовое поле ушло в отставку в качестве первого ответчика. Если параметр force установлен наYES
, текстовое поле никогда не спрашивается; он вынужден уйти в отставку.
Ответ 2
Невозможно напрямую получить, какой объект является текущим первым ответчиком (которого я знаю, по крайней мере), не тестируя их отдельно. Что вы можете сделать, так это создать метод, содержащий все подзадачи, которые могли бы быть активным первым ответчиком, следующим образом:
- (void)dismissKeyboard {
if (myTextField1.isFirstResponder) {
[myTextField1 resignFirstResponder];
}
else if (myTextField2.isFirstResponder) {
[myTextField2 resignFirstResponder];
}
else if (myTextField3.isFirstResponder) {
[myTextField3 resignFirstResponder];
}
else if (myTextField4.isFirstResponder) {
[myTextField4 resignFirstResponder];
}
}
В действительности, я, как правило, делаю это так, без предварительного тестирования того, является ли конкретный UIView текущим первым ответчиком, и не думаю, что есть какой-то значительный успех/проблема производительности (что я все равно заметил)
- (void)dismissKeyboard {
//Send resignFirstResponder message to all possible first responders...
[myTextField1 resignFirstResponder];
[myTextField2 resignFirstResponder];
[myTextField3 resignFirstResponder];
[myTextField4 resignFirstResponder];
}
Надеюсь, что это поможет...
Ответ 3
Этот быстрый код работает при поиске первого ответчика:
func findActiveResponderFrame(view:UIView)->UIView?{
if view.isFirstResponder() {
return view
} else {
for sub in view.subviews {
if let subView = sub as? UIView,
found = findActiveResponderFrame(subView){
return found
}
}
}
return nil
}
Ответ 4
Вы можете следовать, если вы специально хотите получить поле текста ответчика. Получить текущего первого ответчика без использования частного API
вы также можете использовать следующий код, если вы хотите просто отключить клавиатуру с активным текстовым полем -
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
Ответ 5
Обновление для Swift 3
Эта функция скрывает клавиатуру любого активного текстового поля в Swift 3:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}