iPad中UISearchBar激活后inputAccessoryView隐藏且无法恢复问题
iPad上UISearchBar编辑后inputAccessoryView无法恢复显示的问题解决
问题描述
在iPad设备上,激活UISearchBar进入编辑状态后,inputAccessoryView会被隐藏;即使结束UISearchBar的编辑状态,该视图也无法自动重新显示。
问题复现步骤
- 激活UISearchBar开始编辑
- 取消UISearchBar的编辑状态
- 对比编辑前后inputAccessoryView的可见性
解决方案
方法一:监听编辑通知恢复视图
利用编辑结束通知,延迟执行视图恢复逻辑,适配键盘收起的动画周期:
override func viewDidLoad() { super.viewDidLoad() // 绑定搜索栏文本编辑结束通知 NotificationCenter.default.addObserver( self, selector: #selector(restoreInputAccessoryView), name: UITextField.textDidEndEditingNotification, object: searchBar.searchTextField ) } @objc private func restoreInputAccessoryView() { // 延迟0.1秒执行,确保键盘完全收起 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { // 重新设置inputAccessoryView并触发状态更新 self.inputAccessoryView = self.customAccessoryView // 替换为你的自定义视图实例 self.becomeFirstResponder() self.resignFirstResponder() } } deinit { // 销毁时移除通知监听,避免内存泄漏 NotificationCenter.default.removeObserver(self) }
方法二:通过UISearchBar代理处理
实现代理协议,在编辑结束回调中强制恢复视图显示:
extension YourViewController: UISearchBarDelegate { func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { guard let accessoryView = self.inputAccessoryView else { return } // 强制显示并更新布局 accessoryView.isHidden = false self.view.layoutIfNeeded() // 重新赋值触发系统更新视图层级 self.inputAccessoryView = accessoryView } }
问题原因
这是iPad平台上UISearchBar的已知系统行为问题:当搜索栏激活键盘时,系统会临时移除当前视图的inputAccessoryView,但在编辑状态结束、键盘收起后,未自动将该视图恢复到原层级中。
内容的提问来源于stack exchange,提问作者Rajat Mishra
相关产品推荐
相关产品推荐

