自定义转场后UISearchController从视图层级消失的问题
iOS UISearchController 嵌入导航栏的正确配置
针对你把两个视图控制器嵌入UINavigationController,且第一个VC需要配置UISearchController的场景,我整理了完整的配置代码和关键注意事项,帮你避开常见的坑:
完整配置代码
private func configureSearchController() { // 初始化搜索控制器(需提前声明searchController属性) searchController = UISearchController(searchResultsController: nil) // 设置搜索结果更新代理,当前VC需遵循UISearchResultsUpdating协议 searchController.searchResultsUpdater = self // 搜索时保持背景清晰(默认true会模糊背景) searchController.obscuresBackgroundDuringPresentation = false // 搜索时不隐藏导航栏,避免界面跳动 searchController.hidesNavigationBarDuringPresentation = false // 可选:关闭搜索时背景变暗效果 // searchController.dimsBackgroundDuringPresentation = false // 将搜索控制器绑定到导航栏 navigationItem.searchController = searchController // 可选:设置搜索栏是否随滚动隐藏,false则始终显示在导航栏 navigationItem.hidesSearchBarWhenScrolling = false // 可选:设置搜索栏占位文本 searchController.searchBar.placeholder = "输入关键词搜索" }
关键配置解析
searchResultsUpdater = self:必须让当前视图控制器遵循UISearchResultsUpdating协议,并重写updateSearchResults(for:)方法来响应搜索输入变化。obscuresBackgroundDuringPresentation = false:默认值为true,会在搜索时模糊背景;如果需要背景保持可交互或清晰,设为false。hidesNavigationBarDuringPresentation = false:这是嵌入导航栏时的核心设置,默认true会导致搜索时导航栏隐藏,产生突兀的界面跳动,设为false可保持导航栏始终可见。navigationItem.searchController = searchController:这一步是将搜索栏正式添加到导航栏的关键,千万不要遗漏。hidesSearchBarWhenScrolling = false:控制搜索栏是否随滚动隐藏,false让它固定在导航栏顶部,true则会在向上滚动时隐藏,向下滚动时显示。
补充实现要点
- 实现
UISearchResultsUpdating协议的方法,处理搜索逻辑:
extension YourViewController: UISearchResultsUpdating { func updateSearchResults(for searchController: UISearchController) { guard let searchText = searchController.searchBar.text?.trimmingCharacters(in: .whitespacesAndNewlines), !searchText.isEmpty else { // 搜索文本为空时,恢复原始数据 return } // 这里写你的搜索过滤逻辑,比如筛选数据源并刷新UI } }
- 如果需要将搜索结果展示在独立的视图控制器中,初始化时传入对应的VC即可:
let resultsVC = SearchResultsViewController() searchController = UISearchController(searchResultsController: resultsVC)
- 确保当前视图控制器是UINavigationController的根控制器,这样导航栏的配置才能正常生效。
内容的提问来源于stack exchange,提问作者Tigran Iskandaryan
相关产品推荐
相关产品推荐

