【问题标题】:Dismiss keyboard in iOS在 iOS 中关闭键盘
【发布时间】:2020-05-02 18:57:03
【问题描述】:

我查看并尝试了 Swift 3、Xcode 8 的多种解决方案,但都无法正常工作。我试过了:

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

并将文本字段输入设置为第一响应者:

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

我不知道从 Xcode 8 到 Xcode 9 的某些东西是否会导致这些方法不起作用,或者我是否在其他地方搞砸了。我有 9 个文本字段,它们都将委托设置为 self。在按下回车键时,它们的标签会递增以移动到下一个文本字段。不要认为这会影响它。对不起,这是新的!代码在这些尝试的功能中都可以正常运行,但它们的键盘仍然存在。我只想在任何文本字段之外触摸时关闭键盘。

【问题讨论】:

  • 显示该代码的位置。要具体和完整。提供足够的信息以允许其他人运行您的代码并查看问题所在。这些不是委托方法,因此不清楚您的架构是什么。

标签: ios swift keyboard


【解决方案1】:

首先将此扩展名写入任何 swift 文件中

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

    }

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

比该视图的 viewDidLoad 仅在任何视图控制器中调用都有文本字段。

self.hideKeyboardWhenTappedAround()

【讨论】:

  • 这行得通,谢谢!尽管由于#selector,它确实让我把@objc 放在了funcdismissKeyboard 前面。除此之外,它很棒。你知道touchesBegan不能做到这一点的原因吗?是因为文本字段在滚动视图中吗?如果我只是在起始视图中编写一个文本字段,touchesBegan 方法就可以正常工作。
  • 不要在选择器中使用。
  • 调用这个方法n viewDidLoad。如果这比点击+我的答案有效。
【解决方案2】:

Swift 4、5。我总是在点击和返回按钮时使用隐藏键盘。

override func viewDidLoad() {
    super.viewDidLoad()
    hideKeyboardWhenTappedAround()
    emailTextField.delegate = self // your UITextfield
    passwordTextField.delegate = self // your UITextfield
}

// 隐藏键盘

extension EmailAutorization: UITextFieldDelegate {

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

// Around tapped
func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(EmailAutorization.dismissKeyboard))
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
}

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

}

【讨论】:

    【解决方案3】:

    您是否尝试调试程序以查看代码是否完全停止在函数中(带断点)?通常这段代码应该可以工作...检查那些 textFields 是在 super view 还是在 child view 中,如果它们是,也许你应该拨打self.childView.endEditing(true)

    如果您真的使用多个文本字段,也许您应该尝试 IQKeyboardManager 库。我在所有项目中都使用它。你可以在这里找到它:https://github.com/hackiftekhar/IQKeyboardManager。使用简单,支持良好。只需通过 cocoa pods 安装它,将 IQKeyboardManager.sharedManager().enable = true 放入 AppDelegate 即可开始使用。 :)

    【讨论】:

    • 你是对的。代码不会在函数内部的断点处停止。这些字段位于滚动视图中的子视图中,但我无法调用 self.childView。
    • 嗯...也许你可以试试这些stackoverflow.com/questions/5143873/…
    【解决方案4】:

    您确定正在调用touchesBegan 吗?如果您确定,请尝试将self.resignFirstResponder() 添加到您的touchesBegan 函数中。这告诉您的视图控制器它不再是第一响应者并且应该关闭键盘。

    如果没有,您需要创建一个UITapGestureRecognizer,将其添加到您的视图中,然后将其连接到调用self.resignFirstResponder() 的函数。

    【讨论】:

      【解决方案5】:

      这是关闭键盘并在键盘打开时向上移动视图的解决方案:Swift 5

         override func viewDidLoad() {
          super.viewDidLoad()
          let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
          view.addGestureRecognizer(tap)
          NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
          NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
      }
      
       //This Method Will Hide The Keyboard
      @objc func taped(){
        self.view.endEditing(true)   
      }
      
      @objc func KeyboardWillShow(sender: NSNotification){
      
          let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
          if self.view.frame.origin.y == 0{
              self.view.frame.origin.y -= keyboardSize.height
          }
      
      }
      
      @objc func KeyboardWillHide(sender : NSNotification){
      
          let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
          if self.view.frame.origin.y != 0{
              self.view.frame.origin.y += keyboardSize.height
          }
      
      }
         override func viewWillDisappear(_ animated: Bool) {
          super.viewWillDisappear(true)
          NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
          NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
      }
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      猜你喜欢
      • 2011-10-17
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多