iOS中如何关闭键盘

6

我尝试了多个适用于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个文本框,它们都将代理设置为自身。它们的标签递增以在按返回键时移动到下一个文本框。我认为这不会影响它。抱歉,我是新手!代码运行良好,但键盘仍然存在。我只想在触摸任何文本框外部时关闭键盘。


1
展示代码所在位置。具体而完整地提供足够的信息,以允许其他人运行您的代码并查看问题所在。这些不是委托方法,因此不清楚您的架构意图是什么。 - matt
5个回答

23

首先在任何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()

这个有效,谢谢!虽然它让我在 func dismissKeyboard 前面加上了 @objc,因为 #selector 的缘故。除此之外,它很棒。你知道 touchesBegan 不能实现这个的原因吗?是因为文本字段在滚动视图中吗?如果我只在起始视图中写一个单一的文本字段,touchesBegan 方法就可以正常工作。 - Yi Li
do not use in selector. - anshul king
调用此方法 n viewDidLoad。如果有效,请点赞我的回答。 - anshul king

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)
 }
}

1
这是解决键盘弹出时隐藏键盘并将视图上移的方案: 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)
}

请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - codedge

0

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

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


0

你尝试过调试程序以查看代码是否在函数中停止(使用断点)吗?通常这段代码应该可以工作...检查一下那些文本字段是在父视图还是在子视图中,如果它们在子视图中,也许你应该调用self.childView.endEditing(true)

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


你是对的。代码在函数内部的断点处没有停止。这些字段位于滚动视图中的子视图中,但是我无法调用self.childView。 - Yi Li
嗯...也许你可以尝试一些这些 https://dev59.com/rG435IYBdhLWcg3w50j4 - R.Radev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接