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

自定义转场后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则会在向上滚动时隐藏,向下滚动时显示。

补充实现要点

  1. 实现UISearchResultsUpdating协议的方法,处理搜索逻辑:
extension YourViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text?.trimmingCharacters(in: .whitespacesAndNewlines),
              !searchText.isEmpty else {
            // 搜索文本为空时,恢复原始数据
            return
        }
        // 这里写你的搜索过滤逻辑,比如筛选数据源并刷新UI
    }
}
  1. 如果需要将搜索结果展示在独立的视图控制器中,初始化时传入对应的VC即可:
let resultsVC = SearchResultsViewController()
searchController = UISearchController(searchResultsController: resultsVC)
  1. 确保当前视图控制器是UINavigationController的根控制器,这样导航栏的配置才能正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:06:50