Как выйти из поиска, нажав кнопку "Отмена"?

У меня есть панель поиска с кнопкой отмены. Но когда я нажимаю кнопку "Отмена", она не закрывает панель поиска. Как я могу сделать это, нажав кнопку "Отмена", он вернет строку поиска в первое состояние?

Если у вас есть вопросы - спросите меня, пожалуйста,

Ответ 1

Вам нужно реализовать UISearchBarDelegate:

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

Установите делегат панели поиска в self

 override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.showsCancelButton = true
        searchBar.delegate = self

а затем выполните функцию делегата butCancelSearchAction, чтобы сделать все, что вам нужно, чтобы отменить действие поиска и reset текст поиска:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    // Do some search stuff
}

func searchBarCancelButtonClicked(searchBar: UISearchBar) {
    // Stop doing the search stuff
    // and clear the text in the search bar
    searchBar.text = ""
    // Hide the cancel button
    searchBar.showsCancelButton = false
    // You could also change the position, frame etc of the searchBar 
}

Ответ 2

class MyController: UIViewController, UISearchBarDelegate {
    // Called when search bar obtains focus.  I.e., user taps 
    // on the search bar to enter text.
    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = true
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        searchBar.text = nil
        searchBar.showsCancelButton = false

        // Remove focus from the search bar.
        searchBar.endEditing(true)

        // Perform any necessary work.  E.g., repopulating a table view
        // if the search bar performs filtering. 
    }
}

Ответ 3

Попробуйте. Он отлично работает.

class MyViewController: UIViewController, UISearchBarDelegate {

    func searchBarTextDidBeginEditing(_searchBar: UISearchBar) {
        searchBar.setShowsCancelButton(true, animated: true)
        //write other necessary statements
    }

    func searchBarCancelButtonClicked(_searchBar: UISearchBar) {
        searchBar.text = nil
        searchBar.setShowsCancelButton(false, animated: true)

        // Remove focus from the search bar.
        searchBar.endEditing(true) 
    }
} 

Ответ 4

Вам нужно реализовать UISearchBarDelegate.

Протокол UISearchBarDelegate определяет дополнительные методы, которые вы реализуете для создания функционального элемента управления UISearchBar. Объект UISearchBar предоставляет пользовательский интерфейс для поля поиска на панели, но его ответственность за выполнение действий при нажатии кнопок выполняется. Как минимум, delegate необходимо выполнить фактический поиск, когда текст введен в textField. Прочтите это

В Objective C

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {

     [self.searchDisplayController setActive:NO animated:YES];

}

В Swift:

func searchBarCancelButtonClicked(searchBar: UISearchBar) {

    self.searchDisplayController.setActive(false, animated: true)
}

Ответ 5

Swift 3

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.showsCancelButton = true
    return true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
    searchBar.resignFirstResponder()
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
    searchBar.showsCancelButton = false
    searchBar.resignFirstResponder()
}

The Cancel button appears only when the user start entering characters in the field.

Ответ 6

Когда вы нажимаете кнопку отмены, searchBar видит, что у вас есть новая вещь для поиска, поэтому, если вы нажмете resignFirstResponder() на cancelButton, она не будет работать, потому что после этого он вызовет didBeginText.

Итак, я помещаю условие в didBeginText, поэтому, когда строка в поиске имеет меньше или 0 символов, он уйдет в отставку первого ответчика. Точно так же:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.characters.count < 1 {
        searchBar.resignFirstResponder()
    }
}

Это легкий подход и работает. С наилучшими пожеланиями!

Ответ 7

Попробуйте следующее:

searchController.active = false

Ответ 8

Я также столкнулся с этой проблемой, в моем случае после поиска любого элемента из представления таблицы, чем щелчок одного из элементов результата, он открыл подробный вид, но панель поиска не исчезла. Я использую Nicat answer с небольшими изменениями, вот моя версия:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    searchController.isActive = false
    self.searchBarCancelButtonClicked(searchController.searchBar)

    ...
}