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
相关产品推荐
相关产品推荐

