How to make keyboard dismiss when I press out of searchbar on Swift?

SwiftKeyboardUisearchbarSearchbarUisearchbardelegate

Swift Problem Overview


I try to make my searchbar on swift, but I have a problem to dismiss keyboard on screen when I pressed out of searchbar. When I try with textfield, it works perfectly fine with this code.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }   

It work when i press out of my textfield and then the keyboard is gone. I want to make like that with my searchbar, because when I use searchbar and use the same way like textfield, it doesn't work at all. Any reference or code is very useful for me.

Swift Solutions


Solution 1 - Swift

try this :

self.mySearchController.searchBar.endEditing(true)

replace mySearchController with your created controller name.. If you did not create it programmatically but instead you just dragged a search bar from library then IBoutlet your searchable to your class and reference it as:

self.mySearchBar.endEditing(true)

Solution 2 - Swift

I found it easier and simplier to use Table View for dismissal. (If you're using table view)

Swift 4:

self.tableView.keyboardDismissMode = .onDrag

Solution 3 - Swift

Tested and working!

func searchBarSearchButtonClicked(searchBar: UISearchBar) 
{
    searchActive = false;
    self.mySearchBar.endEditing(true)
}

Edit for Swift 4.2

func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
    {
        searchActive = false
        self.searchBar.endEditing(true)
    }

Solution 4 - Swift

 func searchBarSearchButtonClicked(searchBar: UISearchBar) {
        
        searchActive = false;
        searchProject.resignFirstResponder()
    }

This method will be invoked when user click search button on keyboard.So here we can dismiss keyboard.I think this is the right method.

Solution 5 - Swift

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.

  1. Ctrl-drag a Tap Gesture Recognizer from the Object Library to your View Controller.

enter image description here

  1. Ctrl-drag the recently added Tap Gesture Recognizer from the document outline in the storyboard to your class implementation as IBAction.

enter image description here

  1. 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.

Solution 6 - Swift

Swift 4+:

You can try, creating a tap gesture and add in the self.view

let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.singleTap(sender:)))
singleTapGestureRecognizer.numberOfTapsRequired = 1
singleTapGestureRecognizer.isEnabled = true
singleTapGestureRecognizer.cancelsTouchesInView = false
self.view.addGestureRecognizer(singleTapGestureRecognizer)

and in selector func you call self.searchBar.resignFirstResponder

@objc func singleTap(sender: UITapGestureRecognizer) {
    self.searchBar.resignFirstResponder()
}

Solution 7 - Swift

You can use a general UIViewController extension

  1. Just add a new swift file on the project and paste the following code snippet

Code

extension UIViewController {

    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard(_:)))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
    
    @objc func dismissKeyboard(_ sender: UITapGestureRecognizer) {
        view.endEditing(true)
        
        if let nav = self.navigationController {
            nav.view.endEditing(true)
        }
    }
 }

2. Now call hideKeyboardWhenTappedAround() from viewDidLoad method where you want keyboard hiding feature.

Solution 8 - Swift

class MaCaveViewController: UIViewController, UISearchBarDelegate {
    
    @IBOutlet weak var searchBar: UISearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
    }

    // When button "Search" pressed
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar){
        print("end searching --> Close Keyboard")
        self.searchBar.endEditing(true)
    }
}

This works very well for me.

Solution 9 - Swift

we can do this with following methods

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = true;
    }
    
    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = false;
    }

Solution 10 - Swift

This works for me in Swift 4

   func searchBarSearchButtonClicked(_ searchBar: UISearchBar){

    self.searchBar.endEditing(true)

    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionajiView Question on Stackoverflow
Solution 1 - SwiftKoray BirandView Answer on Stackoverflow
Solution 2 - SwiftDominic SmithView Answer on Stackoverflow
Solution 3 - SwiftThiago ArreguyView Answer on Stackoverflow
Solution 4 - Swiftuser3962845View Answer on Stackoverflow
Solution 5 - SwiftshokuroffView Answer on Stackoverflow
Solution 6 - SwiftSazzad Hissain KhanView Answer on Stackoverflow
Solution 7 - SwiftdipView Answer on Stackoverflow
Solution 8 - SwiftXenoXView Answer on Stackoverflow
Solution 9 - SwiftanjnkmrView Answer on Stackoverflow
Solution 10 - SwiftnanospeckView Answer on Stackoverflow