iOS 11中navigationItem关联的搜索栏无法显示问题求助
解决iOS 11+导航栏中搜索栏不显示的问题
我之前也踩过这个一模一样的坑!iOS 11对UISearchController的集成逻辑做了调整,尤其是和navigationItem结合的部分,稍不注意就会导致搜索栏完全不出现。结合你给出的代码片段,我整理了几个关键排查点和修复方案:
核心问题排查
首先看你有没有漏掉最关键的一步:将resultSearchController赋值给navigationItem的searchController属性(iOS 11+的新API)。如果没做这一步,搜索栏肯定不会显示。
另外,还要检查以下几个属性的设置,这些都可能影响显示:
resultSearchController.obscuresBackgroundDuringPresentation:建议设为false,避免遮挡内容,也能减少奇怪的显示问题resultSearchController.hidesNavigationBarDuringPresentation:如果设为true,只有激活搜索时导航栏才会变化,但如果初始不显示,可能是这个属性和其他设置冲突- 确保你的
UIViewController(或UITableViewController)的navigationItem是有效的,比如控制器已经被正确推入导航栈
修复后的完整示例代码
把你的configureSearchBar()方法补全并调整后,应该是这样的:
func configureSearchBar() { // 初始化搜索控制器,searchResultsController传nil表示用当前控制器显示结果 resultSearchController = UISearchController(searchResultsController: nil) // 提前加载视图(你原来的代码这部分没问题) if #available(iOS 9.0, *) { resultSearchController.loadViewIfNeeded() } else { let _ = self.resultSearchController.view } // 关键:将搜索控制器绑定到导航栏 navigationItem.searchController = resultSearchController // 配置搜索栏的基础属性 resultSearchController.searchBar.placeholder = "搜索内容..." resultSearchController.searchBar.sizeToFit() // 优化显示的关键属性 resultSearchController.obscuresBackgroundDuringPresentation = false resultSearchController.hidesNavigationBarDuringPresentation = false // 如果需要自定义搜索栏的样式(比如你原来要获取searchField) if let searchField = resultSearchController.searchBar.value(forKey: "searchField") as? UITextField { searchField.textColor = .black searchField.backgroundColor = .lightGray // 其他自定义设置... } // 如果是UITableViewController,不要同时设置tableView.tableHeaderView = searchBar // 这是iOS 11+的常见误区,二选一即可 }
额外注意事项
- 如果你的控制器是
UITableViewController,不要同时设置tableView.tableHeaderView = resultSearchController.searchBar,iOS 11+用navigationItem.searchController就足够了,两者混用会导致搜索栏不显示或者布局混乱。 - 确保在
viewDidLoad()中调用这个configureSearchBar()方法,不要在更早的生命周期(比如init)里调用,那时navigationItem可能还未初始化完成。 - 如果你的导航栏有自定义的
titleView,可能需要调整布局优先级,避免和搜索栏冲突。
按照这个方案调整后,搜索栏应该就能正常显示在导航栏里了!
内容的提问来源于stack exchange,提问作者M. Doe
相关产品推荐
相关产品推荐

