2009-01-14 6 views
0

J'ai un UISearchBar et sur la méthode déléguée je cache le clavier lorsque le champ de texte est effacé:Hiding du clavier

- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText { 
    NSLog(@"filter: %@", filterText); 

    if ([filterText length] == 0) { 
     NSLog(@"hiding keyboard"); 
     [filterBar resignFirstResponder ]; 

Maintenant, quand j'utilise le bouton backspace pour effacer le terme de recherche tout est bien. Le clavier se cache lorsque la recherche devient vide. Ce n'est pas le cas lorsque j'appuie sur le bouton «croix» pour effacer complètement le champ de recherche.

Eh bien, pas tout à fait vrai. J'appelle resignFirstResponder et cache le clavier - vous ne pouvez pas le voir car il revient directement. Je l'ai trouvé en observant le clavier afficher/masquer les événements.

Alors, comment se fait-il que le clavier s'affiche à nouveau? Comment puis-je empêcher cela?

je l'ai déjà essayé de marcher sur les ... subviews du UISearchBar et appeler aussi resignFirstResponder, mais à moins que je l'ai fait quelque chose de mal - qui ne résout pas non plus.

Mise à jour:

En fait, je viens de recevoir le clavier pour ne pas désactiver le bouton « Terminé » :-D ... donc je vais « arrêter » descendre cette route comme Kevin suggéré. Je voudrais quand même savoir pourquoi le clavier est revenu comme ça.

Répondre

0

Je suis d'accord fondamentalement avec Kevin, mais cela ne vous aide pas va ici:

Essayez une boucle à travers les sous-vues de la barre de recherche et trouver le frère qui est de la UITextField de classe. Définissez ensuite la propriété delegate de ce champ de texte sur la classe de votre ViewController et y gérez le rappel (par exemple, textViewShouldReturn) ou appelez simplement resignFirstResponder directement dans le champ de texte. Le premier doit évidemment être fait au moment init/load alors que le dernier peut être fait dans votre callback textDidChange existant.

Voici quelques conseils:

http://discussions.apple.com/thread.jspa?threadID=1479468&tstart=0 http://discussions.apple.com/thread.jspa?messageID=8176608

+0

"J'ai déjà essayé de parcourir toutes les sous-vues de l'UISearchBar et d'appeler aussi resignFirstResponder sur celles-ci ... mais à moins que j'ai fait quelque chose de mal - ça ne marche pas Ne résous pas ça non plus. ... donc tu es sûr que ça marche? – tcurdt

+0

Oui, je suis sûr que cela a fonctionné il y a six mois quand j'étais dans une situation similaire - je ne suis jamais descendu cette route et j'ai enlevé ce code plus tard - mais mes logs svn me disent que ça fonctionnait à ce moment là:) –

1

Je vous suggère d'arrêter en essayant de le faire. Cacher le clavier lorsque le champ se vide est un comportement complètement non standard et l'utilisateur ne s'y attendra pas. Dans des situations comme celle-ci, il est préférable de garder votre comportement cohérent avec le reste des applications à travers le système.

+0

bord J'aimerais ... mais malheureusement, la Le bouton "Terminé" du clavier est désactivé lorsque la longueur du texte est 0. L'utilisation d'un bouton "Annuler" supplémentaire est non seulement contre-intuitif et bien pire de l'expérience utilisateur, mais tue également le realestate d'écran requis. Voir aussi http://www.thismuchiknow.co.uk/?p=85 – tcurdt

1

Je vois que vous avez accepté une réponse et ne prévoyez pas de poursuivre dans cette voie, mais je am curieux de savoir si vous pourriez obtenir quelque chose comme vous vouliez en mettant en œuvre ceci:

- (BOOL)canBecomeFirstResponder 
{ 
    return !preventingKeyboardAppearance; // so to speak 
} 

- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText 
{ 
    // handle text 

    preventingKeyboardAppearance = YES; 
    [filterBar resignFirstResponder]; 
} 

Je ne suis pas clair dans quelles circonstances vous définiriez preventingKeyboardAppearance retour à NON, mais je me demande si cela fonctionnerait.

0
-(BOOL)textFieldShouldReturn:(UITextField *)textField { 
     [textField resignFirstResponder]; 

     return YES;  
    } 

[textField resignFirstResponder] ne fonctionne pas un certain temps afin d'utiliser cette
[YorTextFieldName resignFirstResponder] il fonctionne correctement aucune autre fonction pour cacher la clé

Questions connexes