我在NavigationController中有2个控制器。首先将第二个推送到堆栈,用户可以与那里的文本字段进行交互。然后(在一个场景中)用户将点击后退按钮以进入上一屏幕。假设第二个的加载是“重”,所以一旦需要,我将只保留它的一个实例。
预期: 一旦按下后退按钮,我想隐藏键盘。
实际: 当我第二次回到第二个时,第一个响应者会继续恢复。怎么预防?辞职的第一响应者也没有那里的伎俩......
问题演示 https://gitlab.com/matrejek/TestApp
主要代码部分:
class FirstViewController: UIViewController {
var child: UIViewController = {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc = storyboard.instantiateViewController(withIdentifier: "child")
return vc
}()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func onButtonTap(_ sender: Any) {
self.navigationController?.pushViewController(child, animated: true)
}
}
class SecondViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
}
答案 0 :(得分:1)
这看起来很奇怪 - 看起来你的方法应该工作。
显然(基于快速测试),由于您不允许导航控制器释放SecondVC,因此文本字段保持活动状态。"
如果将其添加到SecondViewController
,则会阻止键盘自动重新显示"下次你导航到控制器 - 不确定它是否适合你,但它会完成这项工作:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
DispatchQueue.main.async {
self.view.endEditing(true)
}
}