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

