5

How to dismiss keyboard when pressing Search key? I have a search bar on tableView and I used the following method. It did't work. Any Idea why? Thanks in advance.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true

}

UPDATE 2.0 ----------------------------------------------------

This picture is what I am trying to do, when I click search key nothing happened. enter image description here

I have my UISearchBar delegate has set already

class SearchVC: UIViewController, UITableViewDataSource, UISearchBarDelegate  {


@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var searchBar: UISearchBar!

var data = [// my data here.]

var filteredData: [String]!

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    searchBar.delegate = self
    filteredData = data


    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    tableView.addGestureRecognizer(tap)

}
QQ10
  • 139
  • 2
  • 9

3 Answers3

14

If you are using UISearchBar then first make sure its delegate is set and then add this function

func searchBarSearchButtonClicked(_ searchBar: UISearchBar)  {
    searchBar.resignFirstResponder()
}
Jimbo
  • 25,790
  • 15
  • 86
  • 131
Ram
  • 961
  • 6
  • 14
  • HI, I already have this function. What I am trying to do is when I tap Search bar keyboard shows up and when I click search key, the key board dismiss. I am not sure how to do the second part. – QQ10 Feb 21 '17 at 07:36
  • can you check you have set UIsearchBar delegate – Ram Feb 21 '17 at 07:39
  • I don't have func searchBarSearchButtonClicked(searchBar: UISearchBar) { } function. What should I do inside this function? – QQ10 Feb 21 '17 at 08:00
  • class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate { @IBOutlet weak var searchBar: UISearchBar! override func viewDidLoad() { super.viewDidLoad() /* Setup delegates */ searchBar.delegate = self } func searchBarSearchButtonClicked(searchBar: UISearchBar) { searchBar.resignFirstResponder() } – Ram Feb 21 '17 at 08:07
  • Thanks a lot!! I fixed my issue. I missed func searchBarSearchButtonClicked(searchBar: UISearchBar) { searchBar.resignFirstResponder() } – QQ10 Feb 21 '17 at 08:13
1

The following worked for me.

'searchActive' is used to switch between the filtered values and the original unfiltered values.

'initialUseOfSearchBar' is used to show the keyboard the first time around but after that keyboard is hidden when user presses clear 'x'.

var initialUseOfSearchBar = true

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    searchActive = true

    if searchBar.text?.characters.count == 0 {
        searchActive = false

        if initialUseOfSearchBar == false {
            searchBar.resignFirstResponder()
        }
    }
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    searchActive = false
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    if searchText.characters.count == 0 {
        searchActive = false;
        tableView.reloadData()
        searchBar.resignFirstResponder()
    }

    initialUseOfSearchBar = false

   ...

}

...

user3613987
  • 119
  • 1
  • 2
0

make sure in viewDidLoad() you do self.textField.delegate = self and of course your viewController must conform to the UITextFieldDelegate protocol. Then, make sure you are spelling the function correctly textFieldShouldReturn()

Gabe Spound
  • 146
  • 2
  • 14