UISearchbar clearButton forces du clavier à apparaître
J'ai un UISearchBar qui agit comme un filtre en direct pour une vue de la table. Lorsque le clavier est rejeté par endEditing:, le texte de la requête et le gris de la circulaire bouton "effacer" demeurent. À partir d'ici, si je tape sur le gris bouton "supprimer" du clavier réapparaît comme le texte est effacé.
Comment puis-je éviter cela? Si le clavier n'est pas actuellement ouvert, je veux que le bouton pour effacer le texte sans rouvrir le débat sur le clavier.
Il y a un protocole de la méthode qui est appelée lorsque j'appuie sur le bouton effacer. Mais l'envoi de la UISearchBar un resignFirstResponder message n'a aucun effet sur le clavier.
InformationsquelleAutor Jens Kohl | 2009-07-07
Vous devez vous connecter pour publier un commentaire.
C'est une vieille question et je viens de tomber sur le même problème et a réussi à le résoudre de la manière suivante:
Lorsque le
searchBar:textDidChange:
méthode de la UISearchBarDelegate est appelée à cause de l'utilisateur en appuyant sur le bouton "clear", la barre de recherche n'est pas devenu le premier intervenant, de sorte que nous pouvons en tirer parti afin de détecter lorsque l'utilisateur en fait l'intention de sortir de la recherche et de ne pas attirer l'attention sur la barre de recherche et/ou de faire autre chose.Pour garder une trace de ce, nous avons besoin de déclarer un
BOOL
ivar dans notre viewController, qui est aussi la barre de recherche délégué (appelonsshouldBeginEditing
) et avec une valeur initiale deYES
(en supposant que notre viewController classe est appelée SearchViewController):Plus tard, dans le UISearchBarDelegate, nous mettons en œuvre la
searchBar:textDidChange:
etsearchBarShouldBeginEditing:
méthodes:Fondamentalement, c'est tout.
Meilleur
J'ai trouvé que resignFirstResponder ne fonctionne pas lorsque textDidChange est appelée à partir d'une touche du bouton "dégager". Cependant, l'utilisation de
performSelection: withObject: afterDelay:
semble être une solution de contournement:J'ai trouvé un moyen assez sûr de savoir si le clair bouton a été pressé, et d'ignorer les moments où l'utilisateur n'a qu'à supprimer le dernier caractère de la UISearchBar. Ici, il est :
Assez simple, n'est-ce pas 🙂 ? La seule chose à noter est que si l'utilisateur clique sur le bouton effacer lors de la modification de la UISearchBar l'objet UITextField, vous aurez deux pings, alors que vous, vous allez obtenir un seul, si l'utilisateur clique quand il n'est pas en cours d'édition.
Edit :
Je ne peux pas le tester, mais voici la swift version, comme par Rotem :
@Rotem de mise à jour (Swift2):
var isRemovingTextWithBackspace = false func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { self.isRemovingTextWithBackspace = (NSString(string: searchBar.text!).stringByReplacingCharactersInRange(range, withString: text).characters.count == 0) return true } func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { if searchText.characters.count == 0 && !isRemovingTextWithBackspace { NSLog("Has clicked on clear !") } }
J'ai utilisé une combinaison de @boliva réponse et aussi @radiospiel de réponse à un autre DONC, la question:
Meilleure solution à partir de mon expérience, c'est juste pour mettre un
UIButton
(avec fond clair et pas de texte) au-dessus du système de bouton effacer et de se connecter à unIBAction
Avec mise en page automatique sa juste plus facile
En appuyant sur le bouton "effacer" dans un UISearchBar s'ouvre automatiquement le clavier, même si vous appelez
searchBar.resignFirstResponder()
dans letextDidChange
UISearchBarDelegate méthode.À fait masquer le clavier lorsque vous appuyez sur la touche "x" pour effacer la UISearchBar, utilisez le code suivant. De cette façon, même si
textDidChange
est appelé pendant que vous tapez quelque chose dans la UISearchBar, vous ne cachez le clavier si vous supprimez tout le texte en son sein, des conditions météorologiques, utilisez le bouton supprimer ou vous cliquez sur le "x":Dans votre endEditing méthode, pourquoi ne pas vous désactivez la UISearchBar et là? Depuis que doit être l'endroit où vous démissionner de premier répondant aussi, c'est logique.
De la de la barre de recherche délégué appelle et vous demande d'accepter un changement à partir d'un vieux de la valeur à un nouveau - vous pouvez détecter que la nouvelle valeur a été de néant, avec la vieille valeur non-nulle, et un indicateur que l'utilisateur n'a pas tapé quoi que ce soit depuis le clavier a été durer jusqu' - alors dans ce cas, démissionner de premiers répondants pour la barre de recherche. Vous ne savez pas si le clavier affiche brièvement si.
J'ai une situation très semblable et peut essayer moi-même.
De toucher le bouton effacer les résultats dans
searchText
étant vide. Une autre façon d'y parvenir est de vérifier pour un texte vide dans- (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)searchText
:Pour ceux d'entre vous à l'aide de la
UISearchController
dans iOS 8 et le haut, vous aurez envie de simplement sous-classe de laUISearchController
. Pour être complet, vous pouvez également masquer la annuler bouton, comme je l'ai fait, depuis l'effacement du texte à partir de laUISearchBar
est effectivement une annuler la recherche. J'ai ajouté ce code ci-dessous si vous souhaitez l'utiliser.L'avantage de ceci est que vous serez en mesure de l'utiliser pour toute classe et de tout point de vue, plutôt que d'exiger une sous-classe de
UIViewController
. Je vais même comprendre comment j'initialise monUISearchController
au bas de cette solution.FJSearchBar
Cette classe ne doit être remplacé si vous souhaitez masquer le bouton annuler comme je l'ai fait. Marquage
searchController.searchBar.showsCancelButton = NO
ne semble pas fonctionner dans iOS 8. Je n'ai pas testé iOS 9.FJSearchBar.h
Vide, mais placé ici par souci d'exhaustivité.
FJSearchBar.m
FJSearchController
Voici où vous voulez vous rendre de réels changements. J'ai divisé le
UISearchBarDelegate
dans sa propre catégorie, car, à mon humble avis, les catégories de rendre les classes plus propre et plus facile à maintenir. Si vous voulez garder le délégué au sein de la classe principale de l'interface/l'application, vous êtes plus que bienvenus pour le faire.FJSearchController.h
FJSearchController.m
De certaines des pièces remarque:
BOOL
les variables privées au lieu de propriétés, carsearchBar
est le premier intervenant. Si c'est non, alors nous avons fait de désactiver le contrôleur de recherche parce que le texte est vide et que nous ne sommes plus à la recherche. Si vous vraiment voulez être sûr, vous pouvez également vous assurer quesearchText.length == 0
.searchBar:textDidChange:
est invoquée avantsearchBarShouldBeginEditing:
, c'est pourquoi nous avons traité dans cet ordre.[self.searchResultsUpdater updateSearchResultsForSearchController:self];
àsearchBarSearchButtonClicked:
si vous voulez la recherche effectuée une fois que l'utilisateur appuie sur le de Recherche bouton.Une Swift version de @boliva 's réponse.
Que j'ai pu croiser plusieurs fois maintenant. J'apprécie vraiment les réponses que les gens ont donné.
En fin de compte, j'aimerais vraiment voir Apple vient de nous permettre de nous (les développeurs) pour détecter le moment où le clair de touche a été enfoncée.
Il est évident que la pression qu'il reçoit détecté parce que n'importe quel texte dans la zone de recherche est effacée.
Je devine qu'il n'est tout simplement pas très haut sur leur liste de priorités à droite maintenant... Mais je souhaite vraiment que quelqu'un de chez Apple donnerait UISearchBar un peu d'amour!