使用点击关闭键盘时丢弃输入

discard input when dismissing keyboard with tap

我在多个视图中有一些文本字段,如果用户在键盘外部点击以关闭它,我希望能够丢弃任何输入(即不对已键入的内容执行任何操作)。

按照一些帖子中的建议,我做了以下操作

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

并且我在我想要此行为的任何视图控制器的 viewDidLoad() 方法中调用 self.hideKeyboardWhenTappedAround()

发生的事情是,每当键盘被关闭时,我在 textFieldDidEndEditing 中的代码就会被执行。我不想那样做,因为如果输入不正确就会触发错误,但用户拒绝键盘作为后退的一种方式,而不是发送输入。

我以为 view.endEditing(true) 只是在每个子视图上调用了 resignFirstResponder(),但显然 textFieldDidEndEditing() 也被调用了。 我该如何避免呢?

我一直在寻找关于 SO 的很多帖子,但我可以找到解决问题的原因。 我也可能以错误的方式接近这个问题。

我能够理解我的错误。

用于处理输入的 logic/code 应该放在 textFieldShouldReturn() 方法中,这是在按下键盘的 return 按钮时调用的方法。 如果用户关闭键盘,则不会调用此方法,因为没有调用 return 按钮。

正如@Moshe所说,调用textFieldDidEndEditing方法是正确的,因为编辑确实结束了。

只需将处理输入的逻辑从这里放到另一个方法,问题就解决了。

抱歉这个菜鸟问题,但我觉得它可能对那里的所有其他初学者都有帮助。