在后退按钮上完成编辑UITextField

时间:2017-12-08 16:22:01

标签: ios swift cocoa-touch uikit

我在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)
    }
}

1 个答案:

答案 0 :(得分:1)

这看起来很奇怪 - 看起来你的方法应该工作。

显然(基于快速测试),由于您不允许导航控制器释放SecondVC,因此文本字段保持活动状态。"

如果将其添加到SecondViewController,则会阻止键盘自动重新显示"下次你导航到控制器 - 不确定它是否适合你,但它会完成这项工作:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    DispatchQueue.main.async {
        self.view.endEditing(true)
    }
}