Как получить текущие активные UITextField / UITextView и resignFirstResponder? - PullRequest
13 голосов
/ 22 января 2012

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

Ответы [ 6 ]

27 голосов
/ 08 марта 2013

Начиная с iOS 2.0 и более поздних версий, существует простой способ отклонить клавиатуру, не отслеживая активный в данный момент элемент управления, не просматривая все доступные элементы управления или не используя UITextFieldDelegate.

[self.view endEditing:YES]

Из документов:

endEditing:

Заставляет представление (или одно из его встроенных текстовых полей) оставьте статус первого респондента.

- (BOOL) endEditing: (BOOL) force

Параметры
сила
Укажите YES, чтобы заставить первого респондента подать в отставку, независимо от того, хочет ли он так.

Возвращаемое значение
YES если представление отказалось от статуса первого респондента или NO, если это не так.

Обсуждение
Этот метод смотрит на текущий вид и его подпредставление иерархия для текстового поля, которое в настоящее время является первым респондентом. Если он находит один, он просит это текстовое поле подать в отставку в качестве первого респондента. Если для параметра force установлено значение YES, текстовое поле даже не запрашивается; он вынужден уйти в отставку.

5 голосов
/ 27 апреля 2015

Этот быстрый код работает при поиске первого респондента:

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
}
5 голосов
/ 22 января 2012

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

- (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];
}

Надеюсь, это поможет ...

0 голосов
/ 15 мая 2018

Аналогичный вопрос размещен здесь . Я написал базовую библиотеку создания форм, которая обрабатывает это и проверку. Это называется Swift POP Form ! Он не использует tags, а задает источник данных, содержащий поля, и использует indexPathForCell для запроса, который является активным текстовым полем. Проверьте исходный код для более!

редактирование: Или, как и просили, вот отрывок из него. Эта форма использует UITextFields, встроенную в UITableViewCells:

extension PopFormViewController: UITextFieldDelegate {

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    guard let cell = textField.superview as? PopFormTableViewCell else {
      fatalError() }

    guard let currentIndex = tableView.indexPath(for: cell) else {
      fatalError("cell does not exist") }

    let nextIndex = IndexPath(row: currentIndex.row + 1, section: currentIndex.section)
    let isLastField = viewModel.dataSource.fields.count == nextIndex.row

    if isLastField {
      cell.textField.resignFirstResponder()
      if shouldValidateOnLastFieldReturnKeyTap {
        validator.validate(self)
      }
      return true
    }

    guard let nextCell = tableView.cellForRow(at: nextIndex) as? PopFormTableViewCell else {
      fatalError() }

    nextCell.textField.becomeFirstResponder()
    return true
  }
}
0 голосов
/ 15 февраля 2017

Обновление для Swift 3

Эта функция скрывает клавиатуру любого активного текстового поля в Swift 3:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}
0 голосов
/ 22 января 2012

Вы можете следить, если вы специально хотите получить текстовое поле респондента. Получить текущего первого респондента без использования частного API

Вы также можете использовать следующий код, если вы хотите только отклонить активное текстовое поле клавиатура-

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
   [textField resignFirstResponder];
   return YES;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...