Нежелательная клавиатура после обратной навигации

Все UIViewControllerS в моем приложении управляются на верхнем уровне UINavigationController, в UIViewController что в настоящее время на вершине моего стека навигации у меня есть набор UITextFields.

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

  1. Это прямо или косвенно связано сbecomeFirstResponder() звоните, потому что без этого звонка проблема не возникает.
  2. Даже если я в тестовых целях позвонюresignFirstResponder() незамедлительно после becomeFirstResponder()клавиатура по-прежнему отображается после перехода назад.

Я пробовал другие способы, такие как обнаружение и отставка первого респондента или вызов endEditing() в viewWillDisappear() но не удалось. Я даже не уверен, к чему принадлежит эта клавиатура после того, как соответствующее представление выскочило из стека. Я не могу проверить клавиатуру в View Debugger, поскольку она там не отображается.

Почему появляется клавиатура и как я могу ее предотвратить?

2 ответа

Решение

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

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

var currentTextField: UITextField?

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    if let currentField = self.currentTextField {
        currentField.resignFirstResponder()
    }
}

override public func willMoveToParentViewController(parent: UIViewController?) {
    if (parent == nil) {
        backButtonPushed = true
    }
    super.willMoveToParentViewController(parent)
}

func customTextFieldDidBeginEditing(textField: UITextField) {
    currentTextField = textField
}

public func textFieldShouldEndEditing(textField: UITextField) -> Bool {

    // ...
    // Must return true if back button is pushed.
    if backButtonPushed {
        return true
    } else {
        // ...
    }
}

Вы пытались вызвать endEditing() в viewWillAppear() нового VC вместо этого?

Другие вопросы по тегам