2010-08-05 12 views

Répondre

9

Dans votre délégué, la fonction

- (BOOL)textFieldShouldClear:(UITextField *)textField 

est appelé lorsque les utilisateurs veut effacer le champ de texte. Si vous retournez OUI et appelez

[textField resignFirstResponder]; 

le clavier devrait disparaître. Je ne connais pas le clearButtonMode, sauf que vous voudrez peut-être le mettre en avance, de préférence avant d'ajouter la vue à sa vue d'ensemble.

modifier Pour vous assurer que vous démissionnez vraiment le répondeur, essayez de le faire un peu plus tard:

[textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1]; 
+0

Merci, une idée pourquoi le clavier ne disparaît pas lors de l'appel de textFieldShouldClear comme ci-dessus? Cela fonctionne avec textFieldShouldReturn par exemple. – Dan

+1

Oui, peut-être qu'après la compensation, les forces de l'interface utilisateur se concentrent sur le terrain de toute façon. Essayez de faire la démission un peu plus tard, en utilisant la ligne que j'ai ajoutée à ma réponse. – mvds

+1

Cheers, semble que le retard a résolu le problème! – Dan

5

Le retard n » ai pas Je travaille bien pour moi. Au lieu de cela, j'ai ajouté une variable d'instance au délégué:

BOOL cancelEdit; 

Puis, dans la mise en œuvre du délégué:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (cancelEdit) { 
     cancelEdit = NO; 

     return NO; 
    } else { 
     return YES; 
    } 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField 
{ 
    cancelEdit = YES; 

    return YES; 
} 
+0

C'est la meilleure solution. – Shmidt

+0

excellente solution, merci –

35

Comme mentionné plus haut, il semble Apple est mise au point effectuée textfield après vous videz le terrain.

La solution est assez simple. Il suffit de nettoyer le champ vous, resignFirstResponder et retour NO

-(BOOL)textFieldShouldClear:(UITextField *)textField 
    { 
     textField.text = @""; 
     [textField resignFirstResponder]; 

     return NO; 
    } 
+0

La meilleure solution pour moi! Merci beaucoup! –

+0

Je ne veux pas afficher le clavier si l'utilisateur tape sur le bouton d'effacement, mais si le clavier est affiché, je ne veux pas le cacher. Je supprime simplement '[textField resignFirstResponder];' du code ci-dessus. –

0

J'ai découvert ce comportement étrange a été causé par un geste de reconnaissance de la compétition qui a démissionné le premier intervenant avant que le clavier avant textFieldShouldClear: a été appelé. Il semblait corrompre le premier répondant.

Si vous l'avez configuré de cette manière, assurez-vous que cancelsTouchesInView sur votre outil de reconnaissance de mouvement est défini sur OUI. De cette façon, vous ne devriez pas avoir besoin de faire quelque chose de spécial dans les méthodes textFieldShouldClear: ou textFieldShouldBeginEditing: delegate.