web-dev-qa-db-fra.com

Comment quitter la recherche en cliquant sur le bouton Annuler?

J'ai une barre de recherche avec le bouton annuler. Mais lorsque je clique sur le bouton Annuler, la barre de recherche ne se ferme pas. Comment puis-je faire en cliquant sur Annuler, la barre de recherche reviendra au premier état?

Si vous avez des questions - demandez-moi, s'il vous plaît

17
John Doe

Vous devez implémenter UISearchBarDelegate:

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

Définir le délégué de la barre de recherche sur auto

 override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.showsCancelButton = true
        searchBar.delegate = self

puis implémentez la fonction déléguée butCancelSearchAction pour faire tout ce que vous devez faire pour annuler la recherche et réinitialiser le texte de recherche:

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 
}
41
greentor
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. 
    }
}
9
orangemako

Essayer. Ça fonctionne bien.

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) 
    }
} 
5
mumu

Très simple et rapide Respectez simplement le protocole UISearchBarDelegate, puis implémentez cette fonction dans votre classe:

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

resign signifie qu'il va quitter

FirstResponder est au centre de la vue

En conclusion, cela détourne l'attention de la barre de recherche et l'annule effectivement.

2
George_E

Je suis également confronté à ce problème, dans mon cas après avoir recherché un élément de la vue tableau que de cliquer sur l'un des résultats, il a ouvert la vue des détails, mais la barre de recherche n'a pas disparu. J'utilise la réponse de Nicat avec un peu de modifications, voici ma version:

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

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

    ...
}
2

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.
2
Manu

Essaye ça:

searchController.active = false
2
Nicat Rzayev

Vous devez implémenter le UISearchBarDelegate

Le protocole UISearchBarDelegate définit les méthodes facultatives que vous implémentez pour rendre fonctionnel un contrôle UISearchBar. Un objet UISearchBar fournit l’interface utilisateur d’un champ de recherche sur une barre, mais il incombe à l’application de mettre en œuvre les actions lorsque des boutons sont activés. Au minimum, la delegate doit effectuer la recherche lorsque le texte est entré dans la textField. Lis ça

En objectif C

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

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

}

En rapide:

func searchBarCancelButtonClicked(searchBar: UISearchBar) {

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

Pour la solution Objective-C

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

    if(@available(iOS 11.0, *)){
        [self.navigationController.navigationItem.searchController.searchBar resignFirstResponder];
    }
    // reload your table or whatever you want.
    // searchController is available after the iOS 11, so it will be good to use @available check
}
0
elia

Lorsque vous appuyez sur le bouton d'annulation, la searchBar le voit comme si vous aviez une nouvelle chose à rechercher. C'est pourquoi si vous mettez resignFirstResponder() sur la cancelButton sur laquelle vous avez cliqué, cela ne fonctionnera pas, car après cela, didBeginText sera appelé.

Je pose donc une condition dans didBeginText. Ainsi, lorsque la chaîne dans la recherche contient moins ou 0 caractères, le premier répondant sera résilié. Juste comme ça: 

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

C'est une approche facile et fonctionne aussi bien. Meilleures salutations!

0
Hackbarth