Подтвердить что ты не робот

Как получить текущий активный UITextField/UITextView и resignFirstResponder?

Возможно ли получить активный UITextField или UITextView в UIView, поэтому я могу скрыть клавиатуру с помощью [text resignFirstResponder];?

4b9b3361

Ответ 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)
}