web-dev-qa-db-fra.com

Clavier iPhone, bouton Terminé et resignFirstResponder

C'est probablement une question stupide, mais je ne trouve pas la réponse dans les documents. Le bouton "Terminé" du clavier contextuel a-t-il toujours fait disparaître le clavier? Je vois beaucoup de code sur le Web comme ceci:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    [theTextField resignFirstResponder];
    return YES;
}

Lorsque j'appuie sur le bouton "Terminé", le clavier s'affiche et le UITextField démissionne du premier répondeur.

Je suppose que le fait d'appuyer sur le bouton "Terminé" ne provoquait pas de UITextField à resignFirstResponder, mais ce comportement a changé à un moment donné.

Je débogue sur OS 3.0 - 3.1.3

50
nevan king

J'ai fait un petit projet de test avec juste un UITextField et ce code

#import <UIKit/UIKit.h>
@interface TextFieldTestViewController : UIViewController
<UITextFieldDelegate>
{
    UITextField *textField;
}
@property (nonatomic, retain) IBOutlet UITextField *textField;
@end

#import "TextFieldTestViewController.h"
@implementation TextFieldTestViewController
@synthesize textField;

- (void)viewDidLoad
{
    [self.textField setDelegate:self];
    [self.textField setReturnKeyType:UIReturnKeyDone];
    [self.textField addTarget:self
                  action:@selector(textFieldFinished:)
        forControlEvents:UIControlEventEditingDidEndOnExit];
    [super viewDidLoad];
}
- (IBAction)textFieldFinished:(id)sender
{
    // [sender resignFirstResponder];
}

- (void)dealloc {
    [super dealloc];
}
@end

Le champ de texte est un UITextField non modifié glissé sur la NIB, avec la prise connectée.
Après avoir chargé l'application, cliquer dans le champ de texte fait apparaître le clavier. En appuyant sur le bouton "Terminé", le champ de texte perd le focus et anime le clavier. Notez que le conseil sur le Web est de toujours utiliser [sender resignFirstResponder] mais cela fonctionne sans.

92
nevan king

Dans Xcode 5.1

Activer le bouton Terminé

  • Dans l'inspecteur d'attributs pour UITextField dans Storyboard, recherchez le champ "Clé de retour" et sélectionnez "Terminé"

Masquer le clavier lorsque vous appuyez sur Terminé

  • Dans Storyboard, faites de votre ViewController le délégué pour UITextField
  • Ajoutez cette méthode à votre ViewController

    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    
15
bickster

De la documentation (toute version):

Il est de la responsabilité de votre application de fermer le clavier au moment de votre choix. Vous pouvez fermer le clavier en réponse à une action utilisateur spécifique, telle que l'utilisateur appuyant sur un bouton particulier de votre interface utilisateur. Vous pouvez également configurer votre délégué de champ de texte pour fermer le clavier lorsque l'utilisateur appuie sur la touche "retour" du clavier lui-même. Pour fermer le clavier, envoyez le message resignFirstResponder au champ de texte qui est actuellement le premier répondeur. Cela provoque la fin de la session d'édition en cours par l'objet champ de texte (avec le consentement de l'objet délégué) et masque le clavier.

Donc, vous devez envoyer resignFirstResponder en quelque sorte. Mais il est possible que le champ de texte perde le focus d'une autre manière pendant le traitement du message textFieldShouldReturn :. Cela entraînera également la disparition du clavier.

6
bealex

Code d'une ligne pour le bouton Terminé: -

[yourTextField setReturnKeyType:UIReturnKeyDone];

Et ajoutez la méthode d'action sur valueChanged de TextField et ajoutez cette ligne-

[yourTextField resignFirstResponder];
2
mmx

J'ai utilisé cette méthode pour modifier le choix du champ de texte

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

if ([textField isEqual:self.emailRegisterTextField]) {

    [self.usernameRegisterTextField becomeFirstResponder];

} else if ([textField isEqual:self.usernameRegisterTextField]) {

    [self.passwordRegisterTextField becomeFirstResponder];

} else {

    [textField resignFirstResponder];

    // To click button for registration when you clicking button "Done" on the keyboard
    [self createMyAccount:self.registrationButton];
}

return YES;

}

0
EddieG