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

UISearchController设置isActive无响应 搜索控制器不显示问题排查

UISearchController无法正常唤起、代理不回调修复方案

核心问题点

  • 未将创建的UISearchController实例关联到当前控制器的navigationItem.searchController属性,iOS 11及以上系统需要通过该关联关系管理搜索控制器的层级、生命周期和代理回调
  • 代码存在两处拼写错误:类名误写为UISeachController(正确为UISearchController),点击事件的@objc修饰符误写为@obcj,会导致编译异常或方法无法响应
  • 不需要手动调用present方法展示UISearchController,该方式不符合系统设计的标准使用流程,会出现层级异常、代理不生效的问题

修复后完整代码

// 需先声明遵守UISearchControllerDelegate协议
class DemoViewController: UIViewController, UISearchControllerDelegate {
    // 修正类名拼写错误
    lazy var searchController: UISearchController = {
        let searchController = UISearchController(searchResultsController: nil)
        searchController.delegate = self
        return searchController
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        definesPresentationContext = true
        // 核心配置:将搜索控制器关联到导航栏
        navigationItem.searchController = searchController
        // 可选配置:关闭滚动自动隐藏搜索栏
        // navigationItem.hidesSearchBarWhenScrolling = false
    }

    // 修正@objc拼写错误
    @objc private func searchTapped() {
        // 直接设置isActive即可正常唤起搜索控制器
        searchController.isActive = true
    }

    // 代理方法会正常触发
    func willPresentSearchController(_ searchController: UISearchController) {
        // 这里可执行搜索控制器展示前的自定义逻辑
    }
}

兼容说明

如果需要适配iOS 11以下系统,无法使用navigationItem.searchController的关联方式,可手动将searchController.searchBar添加到导航栏或自定义视图上,再设置isActive = true即可正常唤起,代理回调也会正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:36:03