如何在搜索栏触发accessibilityElementDidLoseFocus时无需子类化收起键盘?
无需子类化搜索栏实现失焦收起键盘
可以实现,给你几个可行的方案:
监听无障碍焦点变化通知
在你的搜索视图控制器的viewDidLoad里注册UIAccessibility.elementFocusedNotification通知,收到通知时判断当前失焦的元素是否是你的搜索栏,如果是,直接调用搜索栏的resignFirstResponder()方法收键盘:override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(handleAccessibilityFocusChange(_:)), name: UIAccessibility.elementFocusedNotification, object: nil) } @objc private func handleAccessibilityFocusChange(_ notification: Notification) { guard let lostFocusElement = notification.userInfo?[UIAccessibility.elementLostFocusUserInfoKey] as? UISearchBar, lostFocusElement == self.searchBar else { return } searchBar.resignFirstResponder() } deinit { NotificationCenter.default.removeObserver(self) }在视图控制器的无障碍方法里处理
如果你的搜索视图控制器本身重写了accessibilityElementDidLoseFocus方法,可以直接在这里判断失焦元素:override func accessibilityElementDidLoseFocus() { super.accessibilityElementDidLoseFocus() if UIAccessibility.focusedElement != self.searchBar { self.searchBar.resignFirstResponder() } }利用搜索栏内部文本框的编辑通知
不用子类化的话,可以通过value(forKey: "searchField")拿到搜索栏内部的UITextField,再注册编辑结束通知来收键盘:override func viewDidLoad() { super.viewDidLoad() let searchTextField = searchBar.value(forKey: "searchField") as? UITextField NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidEndEditing), name: UITextField.textDidEndEditingNotification, object: searchTextField) } @objc private func textFieldDidEndEditing() { searchBar.resignFirstResponder() }
注意:第三种方法里通过value(forKey: "searchField")获取内部文本框属于私有API的边缘操作,虽然多数情况不会触发拒审,但追求稳妥的话优先选择前两种方案。
内容的提问来源于stack exchange,提问作者iOSer
相关产品推荐
相关产品推荐

