使用点击关闭键盘时丢弃输入
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
方法是正确的,因为编辑确实结束了。
只需将处理输入的逻辑从这里放到另一个方法,问题就解决了。
抱歉这个菜鸟问题,但我觉得它可能对那里的所有其他初学者都有帮助。
我在多个视图中有一些文本字段,如果用户在键盘外部点击以关闭它,我希望能够丢弃任何输入(即不对已键入的内容执行任何操作)。
按照一些帖子中的建议,我做了以下操作
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
方法是正确的,因为编辑确实结束了。
只需将处理输入的逻辑从这里放到另一个方法,问题就解决了。
抱歉这个菜鸟问题,但我觉得它可能对那里的所有其他初学者都有帮助。