web-dev-qa-db-fra.com

la touche "next" de l'application iOS n'ira pas au champ de texte suivant

J'ai une scène simple (utilisant le 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 vous trouvez dans le champ de texte Mot de passe, mais je ne parviens pas à faire fonctionner le bouton suivant (retour) sur le nom d'utilisateur afin de basculer le focus (ou le premier répondant) vers la zone de texte Mot de passe.

Je ferme le clavier alors que 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 à cela, mais je ne peux tout simplement pas le clouer.

40
BamBamBeano

La touche de retour ne fait rien de spécial dans un champ de texte par défaut. Vous devez explicitement changer le premier intervenant:

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

J'utilise ce code qui me permet de contrôler le comportement du formulaire dans le 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;
} 

Tout ce dont vous avez besoin est d’affecter la valeur de la commande à tag et returnkey selon Next ou Done sur chaque contrôle d’entrée.

40
Esteve

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
 }

 //...

}

:-)

11
N3tMaster

Vous devez ajouter UITextFieldDelegate dans le fichier d'en-tête . Vous devez ensuite 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;
}
9
FTFT1234

De nombreuses solutions à ce problème existent. Voir les réponses à cette question: Comment naviguer dans les champs de texte (boutons Suivant/Terminé) .

En savoir plus dans Référence de la classe UIResponder .

5
sherbondy

Voici ce que vous mettriez:

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

Voici une version Swift 2.0 de Rob Mayoff

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == self.emailTextField {
        self.passwordTextField.becomeFirstResponder()
    }else{
        self.passwordTextField.resignFirstResponder()
    }
    return false
}
0
egeelabs

J'ai eu un problème qui motive mot de passe textfield obtenir le focus puis perdre le focus immédiatement. Enfin, j’ai trouvé qu’il valait mieux renvoyer NO dans la fonction textFieldShouldReturn :. Si nous retournons OUI, le champ de texte recevra un appel insertText: call. Ensuite, il va perdre le focus. Je ne sais pas la raison.

J'ai créé une nouvelle question pour ce numéro: UITextField se concentre puis perd immédiatement après avoir renvoyé OUI dans textFieldShouldReturn

Si quelqu'un connaît la raison, s'il vous plaît faites le moi savoir. Merci.

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    if (theTextField == self.textPassword) {
        [theTextField resignFirstResponder];
    } else if (theTextField == self.textUsername) {
        [self.textPassword becomeFirstResponder];
    }
    // we'd better return NO here
    return NO;
}
0
Harrison Xi

Vous pouvez utiliser cette sous-classe UITextfield qui modifie de manière dynamique l'UIReturnKey en fonction de la condition text/string, puis effectuez votre action de continuation dans le délégué textFieldShouldReturn: (UITextField *)

if (textField.returnKeyType == UIReturnKeyNext)

https://github.com/codeinteractiveapps/OBReturnKeyTextField
0
CodeInteractive