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

如何在搜索栏触发accessibilityElementDidLoseFocus时无需子类化收起键盘?

无需子类化搜索栏实现失焦收起键盘

可以实现,给你几个可行的方案:

  • 监听无障碍焦点变化通知
    在你的搜索视图控制器的viewDidLoad里注册UIAccessibility.elementFocusedNotification通知,收到通知时判断当前失焦的元素是否是你的搜索栏,如果是,直接调用搜索栏的resignFirstResponder()方法收键盘:

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(handleAccessibilityFocusChange(_:)), name: UIAccessibility.elementFocusedNotification, object: nil)
    }
    
    @objc private func handleAccessibilityFocusChange(_ notification: Notification) {
        guard let lostFocusElement = notification.userInfo?[UIAccessibility.elementLostFocusUserInfoKey] as? UISearchBar,
              lostFocusElement == self.searchBar else {
            return
        }
        searchBar.resignFirstResponder()
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
  • 在视图控制器的无障碍方法里处理
    如果你的搜索视图控制器本身重写了accessibilityElementDidLoseFocus方法,可以直接在这里判断失焦元素:

    override func accessibilityElementDidLoseFocus() {
        super.accessibilityElementDidLoseFocus()
        if UIAccessibility.focusedElement != self.searchBar {
            self.searchBar.resignFirstResponder()
        }
    }
    
  • 利用搜索栏内部文本框的编辑通知
    不用子类化的话,可以通过value(forKey: "searchField")拿到搜索栏内部的UITextField,再注册编辑结束通知来收键盘:

    override func viewDidLoad() {
        super.viewDidLoad()
        let searchTextField = searchBar.value(forKey: "searchField") as? UITextField
        NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidEndEditing), name: UITextField.textDidEndEditingNotification, object: searchTextField)
    }
    
    @objc private func textFieldDidEndEditing() {
        searchBar.resignFirstResponder()
    }
    

注意:第三种方法里通过value(forKey: "searchField")获取内部文本框属于私有API的边缘操作,虽然多数情况不会触发拒审,但追求稳妥的话优先选择前两种方案。

内容的提问来源于stack exchange,提问作者iOSer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:02:13