UISearchController的searchResultsController.view.isHidden与showsSearchResultsController的区别
在iOS开发中使用UISearchController时,尝试通过直接设置searchResultsController?.view.isHidden控制搜索结果控制器的显示隐藏,会出现偶尔设置为true后视图仍不隐藏的异常。改用showsSearchResultsController属性控制(设为!$0)后,功能恢复正常——即便两种方式的打印结果都显示view.isHidden已经被设置为预期值。
初始失效代码
isHidden .asDriver(onErrorJustReturn: true) .drive(onNext: { [weak self] in print("isHidden Before \($0) \(self?.searchController.searchResultsController?.view.isHidden)") self?.appSearchController.searchResultsController?.view.isHidden = $0 print("isHidden After \($0) \(self?.searchController.searchResultsController?.view.isHidden)") }) .disposed(by: disposeBag)
修复后正常代码
isHidden .asDriver(onErrorJustReturn: true) .drive(onNext: { [weak self] in print("isHidden Before \($0) \(self?.searchController.searchResultsController?.view.isHidden)") self?.appSearchController.showsSearchResultsController = !$0 print("isHidden After \($0) \(self?.searchController.searchResultsController?.view.isHidden)") }) .disposed(by: disposeBag)
两种代码的打印输出
isHidden Before false Optional(false) isHidden After false Optional(true)
本质区别
1. 直接设置view.isHidden:视图层的临时修改
- 这只是对单个视图可见性的直接修改,完全绕过了UISearchController的内部状态管理逻辑。
- UISearchController自身维护着搜索状态(如搜索激活、输入变化),在一些内部触发的时机(比如搜索框文本更新、搜索状态切换),它会自动重置
searchResultsController视图的显示状态,直接覆盖你手动设置的isHidden值。 - 从打印结果能看到,代码执行后
view.isHidden确实被设为true,但UISearchController内部并没有同步这个状态,后续的内部逻辑会把视图重新显示出来,导致你的设置失效。
2. 使用showsSearchResultsController:控制器层面的状态控制
- 这是UISearchController官方提供的状态控制属性,属于控制器级别的API,用于统一管理搜索结果控制器的显示状态。
- 设置该属性时,UISearchController会同步更新自身内部状态,同时处理视图的显示/隐藏、布局调整,还会触发
searchResultsController对应的生命周期方法(如viewWillAppear/viewWillDisappear)。 - 它会和UISearchController的其他状态(如搜索激活状态)保持一致,不会被内部逻辑随意覆盖,因为这是框架定义的标准控制入口,所有相关的状态变更都会通过这个属性来同步。
内容的提问来源于stack exchange,提问作者NewBie
相关产品推荐
相关产品推荐

