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.
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)
Testé et fonctionnel!
func searchBarSearchButtonClicked(searchBar: UISearchBar)
{
searchActive = false;
self.mySearchBar.endEditing(true)
}
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.
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.
Ctrl-drag
un Tap Gesture Recognizer
du Object Library
à votre View Controller.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
.@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.
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()
}
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)
}
}
}
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.
nous pouvons le faire avec les méthodes suivantes
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = true;
}
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
searchBar.showsCancelButton = false;
}