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
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
}
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.
}
}
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)
}
}
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.
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)
...
}
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.
Essaye ça:
searchController.active = false
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)
}
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
}
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!