42 votes

La touche "Suivant" de l'application iOS ne permet pas d'accéder au champ de texte suivant.

J'ai une scène simple (utilisant storyboard dans IB) avec une zone de texte Nom d'utilisateur et Mot de passe. J'ai configuré le clavier pour qu'il se ferme lorsque vous êtes sur le champ de texte du mot de passe, mais je n'arrive pas à faire fonctionner le bouton suivant (retour) sur l'identifiant pour faire passer le focus (ou le premier intervenant) sur le champ de texte du mot de passe.

Je ferme le clavier alors que je suis sur le champ de texte Mot de passe comme ceci :

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
    [theTextField resignFirstResponder];
}
return YES;
}

Je sais que c'est quelque chose de similaire, mais je n'arrive pas à le déterminer.

91voto

rob mayoff Points 124153

Par défaut, la touche retour ne fait rien de spécial dans un champ de texte. Vous devez modifier explicitement le premier répondant :

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    if (theTextField == self.textPassword) {
        [theTextField resignFirstResponder];
    } else if (theTextField == self.textUsername) {
        [self.textPassword becomeFirstResponder];
    }
    return YES;
}

41voto

Esteve Points 478

J'utilise ce code qui me permet de contrôler le comportement du formulaire dans la section storyboard :

-(BOOL) textFieldShouldReturn:(UITextField *)textField{
    if(textField.returnKeyType==UIReturnKeyNext) {
        UIView *next = [[textField superview] viewWithTag:textField.tag+1];
        [next becomeFirstResponder];
    } else if (textField.returnKeyType==UIReturnKeyDone) {
        [textField resignFirstResponder];
    }
    return YES;
} 

Il suffit d'assigner la valeur de la commande en tant que tag et returnkey en fonction de Suivant o Terminé sur chaque commande d'entrée.

11voto

N3tMaster Points 170

Pour ceux qui veulent utiliser le langage Swift :

class MyClass: UIViewController, UITextFieldDelegate {

@IBOutlet weak var text1: UITextField!
@IBOutlet weak var text2: UITextField!
@IBOutlet weak var text3: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    text1.delegate = self
    text2.delegate = self
    text3.delegate = self

}

//....

func textFieldShouldReturn(textField: UITextField) -> Bool{
    if textField == self.text1 {
        self.text2.becomeFirstResponder()
    }else if textField == self.text2{
        self.text3.becomeFirstResponder()
    }else{
        self.text1.becomeFirstResponder()
    }
    return true
 }

 //...
}

-)

9voto

FTFT1234 Points 259

Vous devez ajouter le UITextFieldDelegate dans le fichier d'en-tête. Ensuite, vous devez définir

theTextField.delegate = self;

dans la méthode viewDidLoad. Après cela, vous pouvez continuer avec

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    if (theTextField == self.textPassword) {
        [theTextField resignFirstResponder];
    } else if (theTextField == self.textUsername) {
        [self.textPassword becomeFirstResponder];
    }
    return YES;
}

5voto

sherbondy Points 31

Il existe de nombreuses solutions à ce problème. Voir les réponses postées à cette question : Comment naviguer dans les champs de texte (Boutons Suivant / Terminé) .

Plus d'informations dans le Référence de la classe UIResponder .

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