Firstly, Apple's UISearchBarDelegate is the correct solution to hide keyboard when users click a search button while UISearchBar's instance is the first responder
(learn UIResponder). In short, searchBarSearchButtonClicked(_:) is what you need for this task.
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder() // hides the keyboard.
doThingsForSearching()
}
If it doesn't work, check, does your controller conform to UISearchBarDelegate
and secondly, does UISearchBarDelegate
know about your class implementation (if you don't quite understand what am I talking about, you should learn delegation pattern
starting to read here):
class YourAwesomeViewController: UIViewController, UISearchBarDelegate { // pay attention here
@IBOutlet weak var yourSearchBar: UISearchBar!
override func viewDidLoad() {
super.viewDidLoad()
self.yourSearchBar.delegate = self // and it's important too
}
}
Further, if you need to hide the keyboard touching outside of search bar
without touching the search button (the user may change his mind to search something), UITapGestureRecognizer is a simple way too to deal with that.
Ctrl-drag
a Tap Gesture Recognizer
from the Object Library
to your View Controller.
Ctrl-drag
the recently added Tap Gesture Recognizer
from the document outline
in the storyboard to your class implementation as IBAction
.
- Finally, write a code:
@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) {
self.yourSearchBar.resignFirstResponder()
}
Also, don't forget to create @IBOutlet
for the search bar to have an access inside your class implementation.
Both variants above work well in my project.