返回导航后不需要的键盘

Unwanted Keyboard after Back Navigation

我的应用程序中的所有 UIViewController 都由顶级 UINavigationController 管理。在当前位于我的导航堆栈顶部的 UIViewController 中,我有一组 UITextFields.

当我在这些文本字段之一上调用 becomeFirstResponder() 然后立即返回而不先更改焦点时出现问题,例如通过点击另一个字段。向后导航一级后,键盘出现了,我没有找到阻止它出现或消失的方法。当我进一步推送导航堆栈的视图时,它甚至会保留。

  1. 这与 becomeFirstResponder() 调用,因为没有那个调用, 没有出现问题。
  2. 即使我出于测试目的调用 resignFirstResponder() 紧接在 becomeFirstResponder() 之后 导航回来后键盘仍然出现。

我尝试过其他方法,例如检测并辞去第一响应者或在 viewWillDisappear() 中调用 endEditing(),但没有成功。在相应的视图从堆栈中弹出后,我什至不确定这个键盘属于什么。我无法在 View Debugger 中检查键盘,因为它没有出现在那里。

为什么会出现键盘,如何防止?

您是否尝试在新 VC 的 viewWillAppear() 中调用 endEditing()?

事实证明,抓取第一响应者的表单验证一直在回收它,直到字段内容有效。如果它在向后导航之前不释放状态,键盘会保留,并且很难将第一响应者分配给另一个控件。

我的解决方案是更仔细地跟踪哪个字段是第一响应者,检测后退按钮按下,在这种情况下允许无条件地退出第一响应者,然后为该字段退出第一响应者。

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 {
        // ...
    }
}