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

点击导航栏按钮图标显示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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:33:06