点击导航栏按钮图标显示UISearchController的正确实现方式
点击导航栏按钮图标显示UISearchController的正确实现方式
嘿,我刚好做过类似的需求,分享给你一套能在iPhone和iPad上保持一致体验的实现方案,核心思路就是自定义搜索控制器的展示逻辑,绕过系统默认的导航栏搜索栏嵌入方式:
步骤1:创建并配置UISearchController
首先初始化你的UISearchResultsController,并设置好代理来处理搜索逻辑:
let searchResultsController = UITableViewController(style: .plain) let searchController = UISearchController(searchResultsController: searchResultsController) // 配置搜索控制器基础属性 searchController.searchBar.placeholder = "搜索内容" searchController.searchResultsUpdater = self // 记得遵循UISearchResultsUpdating协议 searchController.obscuresBackgroundDuringPresentation = false
步骤2:添加导航栏搜索按钮
在viewDidLoad里给导航栏添加自定义的搜索触发按钮:
let searchButton = UIBarButtonItem(image: UIImage(systemName: "magnifyingglass"), style: .plain, target: self, action: #selector(showSearchController)) navigationItem.rightBarButtonItem = searchButton
步骤3:实现按钮点击后的展示逻辑
这是保证双端体验一致的关键,我们手动控制搜索控制器的弹出样式:
@objc private func showSearchController() { // 适配iPad的popover样式,iPhone上会自动转为全屏弹出 searchController.modalPresentationStyle = .popover if let popoverController = searchController.popoverPresentationController { popoverController.barButtonItem = navigationItem.rightBarButtonItem popoverController.permittedArrowDirections = .up } // 带动画弹出搜索界面,弹出后自动聚焦搜索栏 present(searchController, animated: true) { self.searchController.searchBar.becomeFirstResponder() } }
步骤4:处理搜索结果实时更新
遵循UISearchResultsUpdating协议,实现搜索内容的实时响应:
extension YourViewController: UISearchResultsUpdating { func updateSearchResults(for searchController: UISearchController) { guard let searchText = searchController.searchBar.text else { return } // 这里根据搜索文本处理数据源,更新结果控制器的列表 searchResultsController.tableView.reloadData() } }
效果说明
这套实现和你想要的效果完全匹配:点击导航栏的搜索图标后,会平滑弹出搜索界面(iPad上是带箭头的弹出框,iPhone上是全屏弹出,交互逻辑一致),搜索栏自动获得焦点,输入内容后实时展示对应的搜索结果。
备注:内容来源于stack exchange,提问作者Shawn Frank
相关产品推荐
相关产品推荐

