Puis-je brancher en UISearchBar du Bouton Effacer?
J'ai un UISearchBar dans mon interface et je veux personnaliser le comportement de la petite claire bouton qui s'affiche dans la barre de recherche, après que certains le texte a été saisi (c'est un petit cercle gris avec une croix en elle, apparaît sur le côté droit du champ de recherche).
Fondamentalement, je veux non seulement effacer le texte de la barre de recherche (qui est la valeur par défaut de mise en œuvre), mais aussi de quelques autres choses de mon interface, mais l'appel d'un de mes propres méthodes.
Je ne trouve rien dans la doc de la UISearchBar de la classe ou de l'UISearchBarDelegate protocole - il n'a pas l'air comme vous pouvez directement accéder à ce comportement.
La seule chose que j'ai remarqué est que les docs a expliqué que le délégué de la méthode:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
est appelée après que le bouton effacer est exploité.
J'ai d'abord écrit un peu de code dans la méthode qui a vérifié la barre de recherche de texte à la propriété, et si elle était vide, il avait été défriché, et de faire tous mes autres trucs.
Deux problèmes cependant:
Tout d'abord, pour une raison que je ne peut pas comprendre, même si je dis la barre de recherche pour resignFirstResponder à la fin de ma méthode, quelque chose, quelque part, est mise de nouveau à becomeFirstResponder. Vraiment ennuyeux...
Deuxièmement, si l'utilisateur n'utilise pas le bouton effacer, et supprime simplement le texte dans la barre à l'aide de la touche delete du clavier, cette méthode est lancé et les résultats de la recherche en aller. Pas bonne.
Des conseils ou des pointeurs dans la bonne direction serait génial!
Merci!
Vous devez vous connecter pour publier un commentaire.
La réponse qui a été accepté, c'est incorrect. Cela peut être fait, j'ai juste pensé à elle et l'a affiché dans une autre question:
UISearchbar clearButton forces du clavier à apparaître
Meilleur
Trouvé la meilleure solution pour ce problème 🙂
dispatch_async(dispatch_get_main_queue(), ^{ [searchBar resignFirstResponder]; });
au lieu deperformSelector
et à l'aide d'une fonction supplémentaire.J'ai ce code dans mon application. La différence est que je n'ai pas de soutien "live search", mais au lieu de lancer la recherche lorsque l'utilisateur appuie sur le bouton de recherche sur le clavier:
Swift version de la manipulation de fermer le clavier sur le bouton effacer, cliquez sur :
Je vous recommande d'utiliser le
rightView
etrightViewMode
méthodes de UITextField pour créer votre propre bouton qui utilise la même image. Je suis en supposant bien sûr que UISearchBar vous permettra d'accéder à l'objet UITextField en son sein. Je pense que ça va.Être conscient de ce à partir de l'iPhone OS Bibliothèque de Référence:
If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.
De sorte que vous aurez probablement aussi besoin de désactiver l'original bouton effacer.
Depuis ce qui vient en premier, et de loin que je puisse voir la question n'est pas vraiment abordée de manière adéquate, je pensais que je poste ma solution.
1) Vous devez obtenir une référence à la zone de texte à l'intérieur de la barre de recherche
2) Vous devez attraper le textField est clair quand il se déclenche.
C'est assez simple. Voici un moyen.
a) assurez-vous de faire de votre classe a , puisque vous allez être en utilisant la méthode du délégué de la zone de texte à l'intérieur de la barre de recherche.
b) en outre, connectez votre barre de recherche à une Prise de courant dans votre classe. Je viens d'appeler le mien barre de recherche.
c) de viewDidLoad vous souhaitez obtenir ahold de la zone de texte à l'intérieur de la barre de recherche. J'ai fait comme ça.
Avis, je me suis assigné une balise pour que textField pour que je puisse la saisir à nouveau, et j'ai fait un textField délégué. Vous pourriez avoir créé une propriété et affecté ce textField pour cette propriété à le saisir plus tard, mais j'ai utilisé une balise.
À partir d'ici, vous avez juste besoin d'appeler le délégué de la méthode:
}
Que c'est. Puisque vous faites référence à un privé valueForKey je ne peux pas garantir qu'il ne sera pas vous causer des ennuis.
Vous pouvez essayer ceci:
_searchController]: unrecognized selector sent to instance
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 une IBAction
N'était pas en mesure de trouver une solution qui n'avaient pas l'utilisation privée de l'API ou n'a pas été mise à niveau de la preuve en cas d'Apple, la vue change la structure de la UISearchBar. Voici ce que j'ai écrit qui fonctionne:
De mettre en œuvre l'UITextFieldDelegate protocole dans votre classe et de remplacer le textFieldShouldClear: méthode.
Edit: Réglage du délégué sur le champ d'une barre de recherche dans iOS8 sera de produire un accident. Toutefois, il ressemble à la barre de recherche:textDidChange: méthode qui sera appelée sur iOS8 sur clair.