如何在iPad的searchBar中追踪“隐藏键盘”按钮并排除取消按钮触发?
解决UISearchBar Cancel按钮与键盘隐藏通知冲突的问题
嘿,这个场景我之前做搜索功能的时候也踩过坑!问题根源在于:当你点击SearchBar的Cancel按钮时,系统会自动收起键盘,所以必然会触发键盘隐藏的Notification,导致你的监听逻辑被误触发。下面给你几个实用的解决方案,按推荐程度排序:
方案一:直接在自定义“隐藏键盘”按钮中执行逻辑(最推荐)
既然你有一个专门的“隐藏键盘”按钮,完全不需要依赖键盘隐藏通知来触发逻辑。直接在按钮的点击事件里,先收起键盘,再执行你的业务逻辑就好,这样就能彻底和Cancel按钮的操作划清界限:
// Swift 示例 @objc func customHideKeyboardButtonTapped() { // 收起键盘 view.endEditing(true) // 这里写你原来在键盘隐藏通知里的逻辑 // 比如刷新TableView、重置搜索状态等等 }
如果是Objective-C:
// Objective-C 示例 - (IBAction)customHideKeyboardButtonTapped:(id)sender { [self.view endEditing:YES]; // 执行你的业务逻辑 }
这个方案最清爽,不需要额外维护状态变量,逻辑也一目了然。
方案二:用标记区分Cancel按钮触发的键盘收起
如果你一定要保留键盘通知的监听方式,可以给Cancel按钮添加单独的点击事件,设置一个布尔标记,在通知回调里判断是否是Cancel触发的:
步骤1:给Cancel按钮绑定点击事件
// Swift 示例 override func viewDidLoad() { super.viewDidLoad() searchBar.showsCancelButton = true // 通过KVC获取Cancel按钮并添加点击事件 if let cancelBtn = searchBar.value(forKey: "cancelButton") as? UIButton { cancelBtn.addTarget(self, action: #selector(cancelBtnTapped), for: .touchUpInside) } } // 定义标记变量 private var isCancelTriggered = false @objc func cancelBtnTapped() { isCancelTriggered = true // 这里可以处理Cancel按钮本身的逻辑,比如清空搜索文本 searchBar.text = "" }
步骤2:在键盘隐藏通知中判断标记
@objc func keyboardDidHide(_ notification: Notification) { // 如果是Cancel按钮触发的,跳过逻辑并重置标记 guard !isCancelTriggered else { isCancelTriggered = false return } // 执行你原来的键盘隐藏逻辑 }
这个方案需要维护一个状态变量,虽然能解决问题,但不如方案一简洁。
方案三:利用UISearchBar的代理方法(进阶)
如果你用了UISearchBar的代理,可以通过searchBarCancelButtonClicked(_:)方法来标记Cancel事件,效果和方案二类似,但更符合SearchBar的使用规范:
// Swift 示例 extension YourViewController: UISearchBarDelegate { func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { isCancelTriggered = true searchBar.text = "" searchBar.resignFirstResponder() } }
然后同样在键盘通知回调里判断isCancelTriggered即可。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

