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
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.
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;
}
}
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é".
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
}
}
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
UITextField
sur NextResponderTextField
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é. Voici la bibliothèque en action:
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)
}
}
- (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;
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