Swift中UISearchBarController卡在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
相关产品推荐
相关产品推荐

