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.
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;
}
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.
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
}
//...
}
:-)
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;
}
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 .
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;
}
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
}
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;
}
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