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

Swift中UISearchBarController卡在NavigationBar下方的解决求助

解决NavigationBar中搜索栏与取消按钮并排的问题

看起来你遇到的问题是默认使用navigationItem.searchController时,搜索栏会被放在导航栏的下方区域,而不是和右侧的取消按钮处在同一行。咱们可以通过调整布局方式,把搜索栏设置为导航栏的titleView来实现并排显示的效果,同时保留你需要的清除文本按钮和取消视图控制器的功能。

解决方案步骤

  • 将搜索栏作为导航栏的TitleView
    放弃直接绑定navigationItem.searchController的方式,转而把搜索栏设置为导航栏的titleView,这样它就能和右侧的取消按钮在同一行展示。
  • 确保清除按钮正常显示
    默认情况下UISearchBar在输入文本后会自动显示清除文本的"x"按钮,显式开启相关属性可以避免意外情况。
  • 保留原有搜索逻辑
    继续使用UISearchResultsUpdater或者改用UISearchBarDelegate,保持你原本的搜索更新逻辑不受影响。

修改后的代码示例

navigationItem.prompt = "Choose a City."
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(dismissPage))

// 保留你原本的搜索控制器配置
let searchController = UISearchController(searchResultsController: nil)
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search"
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
self.definesPresentationContext = true

// 关键调整:把搜索栏设为导航栏的titleView,实现和取消按钮并排
navigationItem.titleView = searchController.searchBar

// 显式开启清除按钮(默认已启用,这里设置更稳妥)
searchController.searchBar.showsClearButton = true

额外补充

如果不需要完整的UISearchController功能,也可以直接创建UISearchBar对象来实现需求,代码更简洁:

navigationItem.prompt = "Choose a City."
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(dismissPage))

let searchBar = UISearchBar()
searchBar.placeholder = "Search"
searchBar.showsClearButton = true
searchBar.delegate = self // 需实现UISearchBarDelegate处理搜索事件
navigationItem.titleView = searchBar

调整后,搜索栏会和右侧的取消按钮并排显示在导航栏同一行,输入文本时清除按钮会自动出现,完全匹配你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:32:11