📜  在 swift 5 外部点击时关闭键盘 - Swift (1)

📅  最后修改于: 2023-12-03 14:51:11.179000             🧑  作者: Mango

在 Swift 5 外部点击时关闭键盘

当用户在输入框中输入完成后,应该及时关闭虚拟键盘,以便用户有更好的浏览体验。在 Swift 5 中,我们可以通过多种方式关闭虚拟键盘,其中包括在用户单击屏幕的其他部分时关闭键盘。

方案一:使用手势识别器

我们可以在 ViewController 中添加一个 UITapGestureRecognizer 手势识别器,然后在手势识别器的动作方法中关闭键盘。下面是一个例子:

class MyViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
    view.addGestureRecognizer(tapGesture)
  }

  @objc func handleTap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
  }
}

在上面的代码中,我们添加了一个 UITapGestureRecognizer 手势识别器。当用户点击屏幕时,handleTap 方法会被调用,并且使用 view.endEditing(true) 方法关闭所有的虚拟键盘。

方案二:使用 UIResponder 的 touchesBegan 方法

我们可以使用 UIResponder 的 touchesBegan 方法来处理触摸事件,并在触摸事件发生时关闭虚拟键盘。以下是一个示例:

class MyTextField: UITextField {

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    resignFirstResponder()
  }
}

在上面的代码中,我们创建了一个名为 MyTextField 的子类,并覆盖了 UIResponder 的 touchesBegan 方法。当用户点击 MyTextField 文本框时,resignFirstResponder() 方法会被调用,并关闭虚拟键盘。

方案三:使用代理方法

我们可以使用 UITextFieldDelegate 和 UITextViewDelegate 代理方法来关闭虚拟键盘。以下是一个示例:

class MyViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
  }

  func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
      textView.resignFirstResponder()
      return false
    }
    return true
  }
}

在上面的代码中,我们实现了 UITextFieldDelegate 和 UITextViewDelegate 的代理方法来关闭虚拟键盘。在 textFieldShouldReturn 方法中,当用户点击 Return 键时,调用 textField.resignFirstResponder() 方法即可关闭键盘。在 textView 方法中,当用户点击 Return 键时,我们采取同样的措施来关闭键盘。

无论你选择哪种方法,关闭虚拟键盘都是一个重要的交互细节,可以提高用户的体验。