我的应用中的所有UIViewController
都由顶级UINavigationController
管理。在当前位于导航堆栈顶部的UIViewController
中,我有一组UITextField
s。
当我在其中一个文本字段上调用becomeFirstResponder()
然后立即向后导航而不先更改焦点时出现问题,例如通过点击另一个字段。导航回一个级别后,键盘出现,我发现无法阻止它出现或使其消失。它甚至在我进一步推动导航堆栈的视图时保持不变。
becomeFirstResponder()
致电,因为没有那个电话,
问题不会发生。resignFirstResponder()
之后的becomeFirstResponder()
导航回来后键盘仍然显示。我尝试了其他方法,例如检测和辞退第一响应者或在endEditing()
中调用viewWillDisappear()
但未成功。从相应的视图弹出堆栈后,我甚至不确定这个键盘属于什么。我无法在View Debugger中检查键盘,因为它没有出现在那里。
为什么会出现键盘,如何防止它?
答案 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()?