我展示了一个使用导航控制器的屏幕,在该屏幕中,我有一个搜索栏,它是作为viewWillAppear()中的第一响应者制作的。问题是我想在单击完成按钮或单击searchBar中的取消时隐藏键盘。但是在对resignFirstResponder()和searchBar.endEditing(true)进行相同操作时,它也会隐藏UISearchBar。当状态也未处于编辑状态时,我想显示UISearchBar。
基本上,我所做的就是将UISearchBar设置为我的第一响应者:
override func viewWillAppear(_ animated: Bool) {
searchBar.becomeFirstResponder()
}
然后,当用户点击搜索时,我进行了搜索:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
// Remove focus from the search bar.
}
与“取消”按钮相同。但是就我而言,这不仅仅是关闭键盘,而是在调用上述函数后也隐藏了UISearchbar()。
答案 0 :(得分:0)
在这种情况下,使用NotificationCenter
是更好的方法。您没有共享任何代码,因此我将在我的旧项目中举一个例子
在您的ViewDidLoad函数中声明
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
并在“按钮”操作中创建一个函数
@objc func keyboardHide() {
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
}, completion: nil)
}
以上代码应将键盘隐藏0.5秒以上。
答案 1 :(得分:0)
使用NotificationCenter addObserver获取键盘显示和键盘隐藏事件
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShowNotification(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHideNotification(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
// MARK: - Keyboard Hide/Show Functions
@objc func keyboardWillShowNotification(notification: Notification) {
print("Keyboaed Show")
}
@objc func keyboardWillHideNotification(notification: Notification) {
print("Keyboaed Hide")
}
注意:-不要忘记在UIviewContoller
消失时删除观察者。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}