如何实现点击UIView时唤起键盘并使UITextField进入编辑状态
解决点击UIView弹出键盘并激活UITextField的问题
嘿,我明白你想实现的效果:点击主View时弹出键盘,让用户能在searchBar里输入,但现在遇到了UIView没法成为第一响应者的问题。这其实是因为UIView默认不支持成为第一响应者,而且你的目标其实不是让View成为第一响应者,而是让UITextField激活来弹出键盘。下面一步步帮你搞定:
问题根源
UIView的canBecomeFirstResponder()默认返回false,所以你调用self.view.becomeFirstResponder()是不会生效的。而且我们真正需要的是让searchBar成为第一响应者,这样键盘才会弹出并允许输入。
解决方案步骤
- 调整点击手势的逻辑:不需要让View成为第一响应者,点击View时直接让
searchBar激活即可,同时修正isKeyboardShowing的初始值(一开始键盘是隐藏的,所以应该设为false)。 - 修正过时的键盘通知API:iOS 13之后,
UIKeyboardWillShow这类通知名已经被弃用,改用UIResponder.keyboardWillShowNotification更稳妥。
修改后的完整代码
import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var searchBar: UITextField! // 初始值改为false,符合键盘默认隐藏的状态 var isKeyboardShowing: Bool = false var viewTapped: UITapGestureRecognizer = UITapGestureRecognizer() override func viewDidLoad() { super.viewDidLoad() searchBar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -500).isActive = true viewTapped = UITapGestureRecognizer(target: self, action: #selector(viewWasTapped)) self.view.addGestureRecognizer(viewTapped) // 使用适配新版本iOS的通知名 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) searchBar.delegate = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 初始状态让searchBar失去第一响应者,确保键盘隐藏 self.searchBar.resignFirstResponder() print("Can the view be the first responder: \(self.view.canBecomeFirstResponder)") print("the searchbar is the first responder: \(searchBar.isFirstResponder)") print("the view is the first responder: \(self.view.isFirstResponder)") } @objc func viewWasTapped(){ print("The view was tapped") if isKeyboardShowing { // 键盘显示时,点击View收起键盘 view.endEditing(true) } else { // 键盘隐藏时,点击View激活searchBar弹出键盘 searchBar.becomeFirstResponder() } } @objc func keyboardWillShow(notification: NSNotification) { print("keyboardWillShow") isKeyboardShowing = true } @objc func keyboardWillHide(notification: NSNotification){ print("keyboardWillHide") isKeyboardShowing = false } // 可选:添加return键收起键盘的逻辑,提升用户体验 func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } }
关键改动说明
- 修正
isKeyboardShowing初始值,匹配键盘默认隐藏的状态 - 在
viewWasTapped的else分支直接调用searchBar.becomeFirstResponder(),激活输入框并弹出键盘 - 更新键盘通知名称,避免使用过时API
- 新增
textFieldShouldReturn代理方法,支持用户点击return键快速收起键盘
这样修改后,点击主View时就会弹出键盘并让searchBar处于可输入状态,再次点击View则收起键盘,完美实现你的需求!
内容的提问来源于stack exchange,提问作者TheRedCamaro3.0 3.0
相关产品推荐
相关产品推荐

