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

Swift新手:如何将UISearchController置于导航标题栏并通过按钮控制显隐?

关于UISearchController集成导航栏及UISearchBar弃用问题的解答

嘿,作为Swift新手能关注到这些细节真的很棒!我来帮你逐一理清这两个问题~

一、能否将UISearchController放置在导航标题栏,并用右侧按钮控制显隐?

当然可以!而且实现起来并不复杂,核心思路是通过切换导航栏的titleView来控制搜索栏的显示和隐藏,同时配合UISearchController的状态管理。下面是完整的代码示例:

class SearchDemoViewController: UIViewController, UISearchResultsUpdating {
    // 初始化搜索控制器,不需要单独搜索结果控制器就传nil
    private let searchController = UISearchController(searchResultsController: nil)
    // 保存原页面标题,方便切换时恢复
    private let originalPageTitle = "我的首页"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = originalPageTitle
        view.backgroundColor = .white
        
        // 配置搜索控制器基础属性
        searchController.searchResultsUpdater = self
        // 搜索激活时是否模糊背景,按需设置
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "输入关键词搜索"
        
        // 添加导航栏右侧的搜索切换按钮
        let toggleSearchButton = UIBarButtonItem(
            image: UIImage(systemName: "magnifyingglass"),
            style: .plain,
            target: self,
            action: #selector(toggleSearchDisplay)
        )
        navigationItem.rightBarButtonItem = toggleSearchButton
    }
    
    // 切换搜索栏显隐的核心方法
    @objc private func toggleSearchDisplay() {
        // 判断当前标题栏是否显示搜索栏
        if navigationItem.titleView is UISearchBar {
            // 切换回原标题
            navigationItem.titleView = nil
            title = originalPageTitle
            // 取消搜索激活状态,收起键盘
            searchController.isActive = false
        } else {
            // 隐藏原标题,显示搜索栏
            title = nil
            navigationItem.titleView = searchController.searchBar
            // 激活搜索,自动弹出键盘
            searchController.isActive = true
        }
    }
    
    // 实现搜索内容更新的代理方法,处理搜索逻辑
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text, !searchText.isEmpty else {
            // 搜索内容为空时的处理,比如恢复原始数据
            return
        }
        // 这里写你的搜索逻辑,比如过滤数据源
        print("正在搜索:\(searchText)")
    }
}

代码说明:

  • 通过navigationItem.titleView的切换,实现搜索栏和原标题的交替显示;
  • 利用searchController.isActive控制搜索状态,自动处理键盘弹出/收起;
  • 通过UISearchResultsUpdating代理监听搜索内容变化,方便处理搜索逻辑。

二、关于UISearchBar的弃用澄清

首先明确:Object库中的UISearchBar并没有被弃用,这是个常见的误解!

iOS 10之后苹果推出UISearchController,是为了提供一套更完整的搜索流程框架——它封装了搜索栏、搜索结果展示、界面状态管理(比如背景模糊、导航栏适配)等一系列功能,让开发者不用手动处理复杂的状态逻辑。

而UISearchBar本身作为独立的UI输入组件,至今仍是可用的,并没有被标记为@deprecated。那为什么有人建议避免直接用UISearchBar呢?主要有这几个原因:

  • 开发效率:UISearchController已经封装了搜索全流程,包括激活状态下的界面变化、键盘管理、搜索结果容器,不用从零搭建;
  • 交互一致性:用UISearchController实现的搜索功能,更贴合苹果官方设计规范,用户体验更统一;
  • 适配性:iOS 11+之后导航栏对UISearchController有原生支持(比如navigationItem.searchController属性),能自动适配不同设备尺寸和导航栏样式。

简单来说:如果只是需要孤立的搜索输入框,UISearchBar完全可用;但如果是做完整的搜索功能,优先用UISearchController会更省心,也更符合现代iOS开发的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:20:02