调用resignFirstResponder后UISearchBar随键盘隐藏?技术求助
解决UISearchBar resignFirstResponder后被隐藏的问题
嘿,这个问题我之前也踩过坑!大概率是布局设置或者UISearchController的默认行为在搞鬼,给你几个针对性的解决办法:
如果你用了UISearchController(推荐实现方式)
如果你的搜索栏是和UISearchController绑定的,默认属性会导致搜索结束后搜索栏被隐藏或收缩,你需要调整这几个关键设置:
override func viewDidLoad() { super.viewDidLoad() let searchController = UISearchController(searchResultsController: nil) searchController.searchBar.delegate = self // 禁止搜索时隐藏导航栏,避免布局跳变 searchController.hidesNavigationBarDuringPresentation = false // 关闭背景模糊,减少布局异常概率 searchController.obscuresBackgroundDuringPresentation = false // 把搜索栏绑定到导航栏 navigationItem.searchController = searchController // 核心设置:让搜索栏始终显示,不会随编辑状态或滚动隐藏 navigationItem.hidesSearchBarWhenScrolling = false }
然后在代理方法里正常处理即可,不用额外操作:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() }
如果你用的是单独的UISearchBar(未绑定UISearchController)
问题可能出在布局约束或模态呈现样式上:
检查布局约束:确保搜索栏的约束是固定的,比如:
- 顶部约束绑定到安全区域顶部或导航栏底部:
searchBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor) - 左右边缘和视图对齐:
searchBar.leadingAnchor.constraint(equalTo: view.leadingAnchor)、searchBar.trailingAnchor.constraint(equalTo: view.trailingAnchor)
- 顶部约束绑定到安全区域顶部或导航栏底部:
调整模态呈现样式:iOS13+默认的
.pageSheet样式偶尔会导致布局异常,改成全屏呈现试试:
在present控制器前添加:let searchVC = YourSearchViewController() searchVC.modalPresentationStyle = .fullScreen // 按需选.overFullScreen也可以 navigationController?.present(searchVC, animated: true)强制刷新布局:在resignFirstResponder后手动触发布局,防止搜索栏被意外移出视图:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() view.layoutIfNeeded() // 强制刷新布局 }
额外排查点
- 检查
viewWillAppear、searchBarTextDidEndEditing等方法里有没有误写隐藏搜索栏的代码; - 确认键盘通知(比如
UIKeyboardWillHideNotification)的回调里没有错误的布局调整。
按上面的方法试一下,应该就能解决搜索栏跟着键盘一起消失的问题啦!
内容的提问来源于stack exchange,提问作者SwiftNinja95
相关产品推荐
相关产品推荐

