29 votes

resignFirstResponder ne cache pas le clavier sur textFieldShouldReturn

J'ai une vue avec un UITextField qui devrait masquer le clavier lorsque vous appuyez sur Retour.

Ma fonction est la suivante:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
 if ( textField == userPassword ) {
  [textField resignFirstResponder];
 }
 return YES;
}
 

Normalement, le clavier doit être caché mais il reste à l'écran. resignFirstResponder est correctement appelé. Qu'est-ce que je rate?

49voto

Brandon Points 885

Je vois que vous avez l'iPad tag sur la. Avez-vous arrive d'être la présentation d'un modal de vue à l'aide de UIModalPresentationFormSheet? Si donc il semble que c'est une limitation de la FormSheet modal présentation (que ce soit Apple fait intentionnellement pour une raison quelconque, ou c'est un bug). Voir ces autres questions pour plus de détails:

Boîte De Dialogue Modale De Ne Pas Faire Disparaître Le Clavier

Modal-Vue-Contrôleur avec clavier sur le paysage de l'iPad change d'emplacement lorsque fermée

33voto

tony.stack Points 543

J'ai trouvé cette méthode utile qui me permet de fermer le clavier lors de la présentation de la boîte de dialogue modale:

  - (BOOL)disablesAutomaticKeyboardDismissal { return NO; }
 

Cela remplacera le comportement par défaut de la boîte de dialogue modale acheter Apple et vous permettra de fermer le clavier. C'est dans la classe UIViewController.

J'espère que ça aidera quelqu'un!

10voto

Marcos Issler Points 100

Si vous utilisez le générateur d'interface, vérifiez si votre UITextField a le délégué lié à votre classe.

-Sélectionnez votre UITextField et dans vos connexions regardez si vous quittez une connexion dans Outlets-> délégué. Sinon, connectez-vous avec la classe de propriétaire de votre fichier.

Cela doit être lié à la classe de propriétaire de votre fichier. Ce délégué indique où rechercher une méthode. Si vous remplacez une méthode, vous devez indiquer où l'objet recherchera cela.

7voto

gmeroz Points 89

Cette solution a fonctionné pour moi après aucun des éléments ci-dessus. après avoir appelé resignFirstResponder, j'ai ajouté une vue modale et l'ai supprimée.

 

    [myTextField resignFirstResponder];
    UIViewController *dummyController = [[UIViewController alloc] init];
    UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
    [dummyController setView:dummy];
    [self presentModalViewController:dummyController animated:NO];
    [dummyController dismissModalViewControllerAnimated:NO];

 

4voto

drynaski Points 91

Pour faire face au bogue mentionné par Brandon, vous pouvez essayer de fermer et de rouvrir votre contrôleur de vue modale tant que vous en avez toujours une référence.

 [textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];
 

(où "self" devrait être le contrôleur que vous avez utilisé à l'origine pour ouvrir le contrôleur de vue modale)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X