You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:00