返回导航后不需要的键盘

时间:2016-02-28 20:08:39

标签: ios swift uinavigationcontroller iphone-softkeyboard

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

当我在其中一个文本字段上调用becomeFirstResponder()然后立即向后导航而不先更改焦点时出现问题,例如通过点击另一个字段。导航回一个级别后,键盘出现,我发现无法阻止它出现或使其消失。它甚至在我进一步推动导航堆栈的视图时保持不变。

  1. 这是直接或间接连接的 becomeFirstResponder()致电,因为没有那个电话, 问题不会发生。
  2. 即使我出于测试目的,打电话 resignFirstResponder()之后的becomeFirstResponder() 导航回来后键盘仍然显示。
  3. 我尝试了其他方法,例如检测和辞退第一响应者或在endEditing()中调用viewWillDisappear()但未成功。从相应的视图弹出堆栈后,我甚至不确定这个键盘属于什么。我无法在View Debugger中检查键盘,因为它没有出现在那里。

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

2 个答案:

答案 0 :(得分: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 {
        // ...
    }
}

答案 1 :(得分:0)

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