返回导航后不需要的键盘
Unwanted Keyboard after Back Navigation
我的应用程序中的所有 UIViewController
都由顶级 UINavigationController
管理。在当前位于我的导航堆栈顶部的 UIViewController
中,我有一组 UITextField
s.
当我在这些文本字段之一上调用 becomeFirstResponder()
然后立即返回而不先更改焦点时出现问题,例如通过点击另一个字段。向后导航一级后,键盘出现了,我没有找到阻止它出现或消失的方法。当我进一步推送导航堆栈的视图时,它甚至会保留。
- 这与
becomeFirstResponder()
调用,因为没有那个调用,
没有出现问题。
- 即使我出于测试目的调用
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 {
// ...
}
}
我的应用程序中的所有 UIViewController
都由顶级 UINavigationController
管理。在当前位于我的导航堆栈顶部的 UIViewController
中,我有一组 UITextField
s.
当我在这些文本字段之一上调用 becomeFirstResponder()
然后立即返回而不先更改焦点时出现问题,例如通过点击另一个字段。向后导航一级后,键盘出现了,我没有找到阻止它出现或消失的方法。当我进一步推送导航堆栈的视图时,它甚至会保留。
- 这与
becomeFirstResponder()
调用,因为没有那个调用, 没有出现问题。 - 即使我出于测试目的调用
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 {
// ...
}
}