触摸整个应用程序时如何关闭键盘

Posted

技术标签:

【中文标题】触摸整个应用程序时如何关闭键盘【英文标题】:How to Dismiss keyboard when touching away across the entire app 【发布时间】:2016-10-05 17:41:32 【问题描述】:

我在弹出键盘的不同视图控制器中有多个文本字段。

我知道当用户点击屏幕的不同部分时如何关闭键盘,但我不想将它硬编码到我应用的每个角落。

那么当用户点击键盘以外的屏幕上的任何位置时,是否有强制键盘在应用程序的任何地方被关闭?

我正在考虑扩展 UIViewController,但我在视图中也有一些文本字段,我将其添加为子视图。也许我可以扩展 TextField 类本身?

【问题讨论】:

【参考方案1】:

我建议创建一个 base UIViewController 并让您的每个 ViewController 继承它;覆盖其中的 touchesBegan 方法:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
    view.endEditing(true)

或者您可以覆盖 viewDidLoad - 在基本 ViewController- 中并添加 UITapGestureRecognizer 到视图中,如下所示:

override func viewDidLoad() 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(Base.endEditing))
    view.addGestureRecognizer(tapGesture)


func endEditing() 
    view.endEditing(true)

【讨论】:

这也可以通过零成本的 Swift 扩展来完成。你不必重构你所有的UIViewController 想象一下,我有一个带有按钮的 viewController。然后我点击那个显然是 viewController 的子视图的按钮。然后 viewController 将不再收到消息,因此键盘仍然存在。我说的对吗? 点击按钮不会调用 touchesBegan,您可以通过在按钮的操作中添加“view.endEditing(true)”来解决此问题... @IBAction func buttonTapped(sender: AnyObject) view. endEditing(true) 【参考方案2】:

如果您希望键盘解除应用于所有视图控制器,您还可以使用视图控制器的扩展:

extension UIViewController 
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        self.view.endEditing(true)
    

【讨论】:

以上是关于触摸整个应用程序时如何关闭键盘的主要内容,如果未能解决你的问题,请参考以下文章

在文本字段外触摸时如何关闭键盘?

触摸只读 UITextView 时关闭 iPhone 数字键盘

当用户触摸视图时关闭键盘

iOS - 在 UITextField 之外触摸时关闭键盘

在 UITextField 之外的任何地方关闭触摸键盘

关闭 UISearchBar 键盘而不影响取消按钮