web-dev-qa-db-fra.com

Passer à la prochaine UITextField lorsque «Next» est exploité

J'ai une application iPad qui contient un formulaire d'inscription. Le formulaire est très basique et ne contient que deux UITextFields pour le nom et l'adresse e-mail.

Le premier TextField est pour le nom des candidats, quand ils entrent leur nom et appuyez sur 'Suivant' sur le clavier, je veux que cela passe automatiquement à la prochaine adresse de messagerie TextField pour l'édition.

Une idée comment je peux régler le bouton suivant du clavier pour passer au clavier suivant?

Merci

35
Paul Morris

Vous devez faire de votre contrôleur de vue le délégué UITextField et implémenter la méthode déléguée UITextField:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if (textField == nameField) {
        [textField resignFirstResponder];
        [emailField becomeFirstResponder];
    } else if (textField == emailField) {
        // here you can define what happens
        // when user presses return on the email field
    }
    return YES;
}

Version Swift:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == nameField {
        textField.resignFirstResponder()
        emailField.becomeFirstResponder()
    } else if textField == emailField {
        // here you can define what happens
        // when user presses return on the email field
    }
    return true
}

Vous pouvez également faire défiler votre vue pour que l'emailField devienne visible. Si votre contrôleur de vue est une instance de UITableViewController, cela devrait se produire automatiquement. Sinon, vous devriez lire cette Apple , en particulier Déplacement du contenu situé sous le clavier.

75
lawicko

En plus de la réponse de @lawicko, je change souvent le texte du bouton pour donner la touche finale (par exemple, dit next quand il y a plus de champs, puis done quand sur le dernier):

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    BOOL isLastTextField = //.. your logic to figure out if the current text field is the last

    if (isLastTextField) {
        textField.returnKeyType = UIReturnKeyDone;
    } else {
        textField.returnKeyType = UIReturnKeyNext;
    }
}
10
Paul.s

Version rapide de la bonne réponse.

D'après mon expérience, vous n'avez pas besoin de resignFirstResponder lors du changement de textFields.

Dans cet exemple, il s'agit simplement de votre nom d'utilisateur et de votre mot de passe de base textFields.

La touche "retour" du clavier dans le storyboard pour le nom d'utilisateur est définie sur "Suivant" et celle pour le mot de passe est définie sur "Terminé".

enter image description here

Ensuite, connectez simplement les délégués pour ces deux champs de texte et ajoutez cette extension et vous avez à peu près terminé.

extension LoginViewController: UITextFieldDelegate {

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        if textField == textFieldPassword {
            self.view.endEditing(true)
        } else {
            textFieldPassword.becomeFirstResponder()
        }
        return true
    }

}
10
William T.

Une manière plus cohérente et robuste consiste à utiliser NextResponderTextField Vous pouvez le configurer totalement à partir du générateur d'interface.

Tout ce que vous devez faire c'est

  1. Définissez le type de classe de votre UITextField sur NextResponderTextField enter image description here
  2. Ensuite, définissez la sortie de nextResponderField pour pointer vers le répondeur suivant, il peut s'agir de n'importe quel UITextField ou n'importe quelle sous-classe UIResponder. Il peut également s'agir d'un bouton UIB et la bibliothèque est suffisamment intelligente pour déclencher l'événement TouchUpInside du bouton uniquement s'il est activé. enter image description hereenter image description here

Voici la bibliothèque en action:

enter image description here

5
mohamede1945

Une extension Swift 4. Passez simplement le tableau de UITextFields et il se connectera chacun au suivant jusqu'au dernier qui démissionne du premier répondeur (cache le clavier):

extension UITextField {

    class func connectFields(fields: [UITextField]) {
        guard let last = fields.last else { return }

        // To reset the targets in case you call this method again to change the connected fields
        fields.forEach { $0.removeTarget(nil, action: nil, for: .editingDidEndOnExit) }

        for i in 0 ..< fields.count - 1 {
            fields[i].returnKeyType = .next
            fields[i].addTarget(fields[i + 1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
        }

        last.returnKeyType = .continue
        last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)
    }
}
3
Jonathan Cabrera
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
    if (textField == self.textFieldName)
    {
        [self.textFieldName resignFirstResponder];
        [self.textFieldPassword becomeFirstResponder];
    }
    else if (textField == self.textFieldPassword)
    {
        [self.textFieldPassword resignFirstResponder];

        [self login:self];
    }

    return true;
}




@interface MLLoginViewController ()<UITextFieldDelegate>

@end

@implementation MLLoginViewController



- (void)viewDidLoad {
    [super viewDidLoad];
    self.textFieldName.delegate = self;
    self.textFieldPassword.delegate = self;
0
Gank

Faites une sortie pour le champ de texte, puis

viewController.h

(IBAction)textFieldDoneEditing:(id)sender;

viewController.m

(IBAction)textFieldDoneEditing:(id)sender {
    [textField resignFirstResponder];
    if (textField == nameField) {
        [emailField becomeFirstResponder];
    } 
} 

Faire la relation entre (afficher l'inspecteur de connexions> Evénements envoyés) didEndOnExit et textFieldDoneEditing

0
davidrl1000