web-dev-qa-db-fra.com

Comment faire en sorte que le clavier disparaisse lorsque j'appuie sur la barre de recherche de Swift?

J'essaie de faire ma barre de recherche sur Swift, mais j'ai un problème pour ignorer le clavier à l'écran lorsque j'ai appuyé sur la barre de recherche. Lorsque j'essaie avec textfield, cela fonctionne parfaitement avec ce code.

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

Cela fonctionne lorsque j'appuie sur mon champ de texte et que le clavier disparaît. Je veux faire comme ça avec ma barre de recherche, parce que quand j'utilise la barre de recherche et utilise la même manière que textfield, cela ne fonctionne pas du tout. Toute référence ou code est très utile pour moi.

37
aji

essaye ça :

self.mySearchController.searchBar.endEditing(true)

remplacez mySearchController par le nom de votre contrôleur créé .. Si vous ne l'avez pas créé par programme, mais que vous avez simplement fait glisser une barre de recherche depuis la bibliothèque, alors IBoutlet peut être consulté dans votre classe et référencé comme suit:

self.mySearchBar.endEditing(true)
51
Koray Birand

Testé et fonctionnel!

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

        searchActive = false;
        searchProject.resignFirstResponder()
    }

Cette méthode sera invoquée lorsque l'utilisateur cliquera sur le bouton de recherche du clavier.Ainsi, nous pouvons supprimer le clavier.Je pense que c'est la bonne méthode.

8
user3962845

Premièrement, le UISearchBarDelegate de Apple est la bonne solution pour masquer le clavier lorsque les utilisateurs cliquent sur un bouton de recherche alors que l'instance de UISearchBar est le first responder (learn UIResponder ). En bref, searchBarSearchButtonClicked (_ :) est ce dont vous avez besoin pour cette tâche.

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder() // hides the keyboard.
    doThingsForSearching()
}

Si cela ne fonctionne pas, vérifiez si votre contrôleur est conforme à UISearchBarDelegate et deuxièmement, UISearchBarDelegate sait-il sur votre implémentation en classe (si vous ne comprenez pas bien de quoi je parle, vous devriez apprendre delegation pattern à commencer à lire ici ):

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
    }
}

Plus, si vous devez masquer le clavier en dehors de search bar sans toucher le bouton de recherche (l'utilisateur peut changer d'avis), UITapGestureRecognizer est aussi un moyen simple pour faire face à cela.

  1. Ctrl-drag un Tap Gesture Recognizer du Object Library à votre View Controller.

 enter image description here

  1. Ctrl-drag le Tap Gesture Recognizer récemment ajouté à partir du document outline dans le storyboard pour votre implémentation de classe en tant que IBAction.

 enter image description here

  1. Enfin, écrivez un code:

@IBAction func tapToHideKeyboard(_ sender: UITapGestureRecognizer) { self.yourSearchBar.resignFirstResponder() }

De plus, n'oubliez pas de créer@IBOutlet pour que la barre de recherche ait un accès dans l'implémentation de votre classe.

Les deux variantes ci-dessus fonctionnent bien dans mon projet.

4
Ivan Shokurov

Swift 4+:

Vous pouvez essayer de créer un geste de tapotement et d’ajouter à la 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)

et dans selector func vous appelez self.searchBar.resignFirstResponder 

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

Vous pouvez utiliser une extension UIViewController générale 1. Il suffit de créer un fichier d'extension et de coller l'extrait de code suivant 

Swift 4

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)
        }
    }
 }
  1. Maintenant, appelez la méthode hideKeyboardWhenTappedAround () from viewDidLoad 
0
dip
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)
    }
}

Cela fonctionne très bien pour moi.

0
XenoX

nous pouvons le faire avec les méthodes suivantes

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

    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = false;
    }
0
rak