Comment puis-je parcourir tous mes champs de texte avec le bouton "Suivant" du clavier de l'iPhone?
Le dernier champ de texte devrait fermer le clavier.
J'ai configuré l'IB les boutons (Next / Done) mais maintenant je suis bloqué.
J'ai implémenté l'action textFieldShouldReturn mais maintenant les boutons Suivant et Terminé ferment le clavier.
Réponses:
Dans Cocoa pour Mac OS X, vous avez la chaîne de répondeurs suivante, où vous pouvez demander au champ de texte quel contrôle doit avoir le focus ensuite. C'est ce qui fait que la tabulation entre les champs de texte fonctionne. Mais comme les appareils iOS n'ont pas de clavier, seulement tactile, ce concept n'a pas survécu à la transition vers Cocoa Touch.
Cela peut être fait de toute façon facilement, avec deux hypothèses:
UITextField
sont sur la même vue parent.En supposant cela, vous pouvez remplacer textFieldShouldReturn: comme ceci:
Ajoutez un peu plus de code et les hypothèses peuvent également être ignorées.
Swift 4.0
Si la vue d'ensemble du champ de texte sera un UITableViewCell, le prochain répondeur sera
la source
UITableViewCell
. Vous devez accéder à l'associéUITableView
et obtenir la cellule contenant le champ de texte que vous recherchez.UITextFieldDelegate
et de définir les délégués des champs de texte.Il existe une solution beaucoup plus élégante qui m'a époustouflée la première fois que je l'ai vue. Avantages:
UITextField
etUITextView
- ou avec n'importe quel contrôle d'interface utilisateur d'entrée de clavierCréez une sous-classe UITextField qui possède une
IBOutlet
propriété appelée nextField. Voici l'en-tête:Et voici l'implémentation:
Dans votre contrôleur de vue, vous allez créer la
-textFieldShouldReturn:
méthode déléguée:Dans IB, modifiez vos UITextFields pour utiliser la
SOTextField
classe. Ensuite, également dans IB, définissez le délégué pour chacun des 'SOTextFields'to' File's Owner '(qui est juste là où vous mettez le code pour la méthode déléguée - textFieldShouldReturn). La beauté de cette conception est que vous pouvez maintenant simplement cliquer avec le bouton droit sur n'importe quel champ textField et affecter la sortie nextField au prochainSOTextField
objet dont vous voulez être le prochain intervenant.De plus, vous pouvez faire des choses sympas comme boucler les textFields pour qu'après que le dernier ait perdu le focus, le premier recevra à nouveau le focus.
Cela peut facilement être étendu pour attribuer automatiquement
returnKeyType
leSOTextField
à unUIReturnKeyNext
s'il y a un nextField affecté - une chose de moins à configurer manuellement.la source
UITableView
. Bien que j'ai desIBOutlet
propriétés sur le contrôleur de vue pour chaque champ de texte, il ne me permet pas de lier lanextField
propriété à ces propriétés sur le propriétaire du fichier. Un conseil comment je peux le faire fonctionner dans ce scénario?textField1.nextField = textField2; textField2.nextField = textField3;
, etc.En voici un sans délégation:
ObjC:
Fonctionne en utilisant l'action (principalement inconnue)
UIControlEventEditingDidEndOnExit
UITextField
.Vous pouvez également facilement le connecter dans le storyboard, donc aucune délégation ou code n'est requis.
Edit: en fait, je ne peux pas comprendre comment connecter cela dans le storyboard.
becomeFirstResponder
ne semble pas être une action offerte pour cet événement de contrôle, ce qui est dommage. Néanmoins, vous pouvez connecter tous vos champs de texte à une seule action dans votre ViewController qui détermine ensuite le champ de texte àbecomeFirstResponder
basé sur l'expéditeur (bien qu'il ne soit pas aussi élégant que la solution de programmation ci-dessus, IMO le fait avec le code ci-dessusviewDidLoad
).la source
[tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
. Merci @mxcl.Voici ma solution pour ce problème.
Pour résoudre ce problème (et parce que je déteste me fier aux balises pour faire des choses), j'ai décidé d'ajouter une propriété personnalisée à l'objet UITextField. En d'autres termes, j'ai créé une catégorie sur UITextField comme ceci:
UITextField + Extended.h
UITextField + Extended.m
Maintenant, voici comment je l'utilise:
Et implémentez la méthode textFieldShouldReturn:
J'ai maintenant une sorte de liste chaînée d'UITextField, chacun sachant qui est le prochain dans la ligne.
J'espère que cela vous aidera.
la source
Une extension rapide qui applique la réponse de mxcl pour rendre cela particulièrement facile (adapté à swift 2.3 par Traveler):
C'est simple à utiliser:
L'extension définira le bouton de retour sur "Suivant" pour tous sauf le dernier champ et sur "Terminé" pour le dernier champ, et changera le focus / fermera le clavier lorsque ceux-ci seront tapés.
Rapide <2,3
SWIFT 3: utilisez comme ceci -
la source
UITextFieldDelegate
et implémentéfunc textFieldDidEndEditing(textField: UITextField)
. Rentrez tôt sitextField != field3
.Une manière plus cohérente et robuste consiste à utiliser NextResponderTextField. Vous pouvez le configurer totalement à partir du générateur d'interface sans avoir besoin de définir le délégué ou d'utiliser
view.tag
.Tout ce que vous devez faire c'est
UITextField
êtreNextResponderTextField
nextResponderField
pour pointer vers le répondeur suivant, il peut être n'importe quoiUITextField
ou n'importe quelleUIResponder
sous-classe. Il peut également s'agir d'unTouchUpInside
bouton UIB et la bibliothèque est suffisamment intelligente pour déclencher l' événement du bouton uniquement s'il est activé.Voici la bibliothèque en action:
la source
J'aime les solutions OO déjà proposées par Anth0 et Answerbot. Cependant, je travaillais sur un POC rapide et petit, donc je ne voulais pas encombrer les choses avec des sous-classes et des catégories.
Une autre solution simple consiste à créer un NSArray de champs et à rechercher le champ suivant lorsque vous appuyez sur suivant. Pas une solution OO, mais rapide, simple et facile à mettre en œuvre. De plus, vous pouvez voir et modifier la commande en un coup d'œil.
Voici mon code (construit sur d'autres réponses dans ce fil):
la source
Voici une implémentation de tabulation à l'aide d'une catégorie sur UIControl. Cette solution présente tous les avantages des méthodes de Michael et Anth0, mais fonctionne pour tous les UIControls, pas seulement pour
UITextField
s. Il fonctionne également de manière transparente avec Interface Builder et les storyboards.Source et exemple d'application: référentiel GitHub pour UIControlsWithTabbing
Usage:
Entête:
La mise en oeuvre:
la source
J'ai essayé de nombreux codes et enfin, cela a fonctionné pour moi dans Swift 3.0 Latest [mars 2017]
La
ViewController
classe doit être héritée deUITextFieldDelegate
pour que ce code fonctionne.Ajoutez le champ Texte avec le numéro de balise approprié et ce numéro de balise est utilisé pour prendre le contrôle du champ de texte approprié en fonction du numéro de balise incrémentiel qui lui est attribué.
Dans le code ci-dessus,
returnKeyType = UIReturnKeyType.next
où fera la touche de retour du clavier à afficher, carNext
vous avez également d'autres options,Join/Go
etc., en fonction de votre application, modifiez les valeurs.Il
textFieldShouldReturn
s'agit d'une méthode contrôlée par UITextFieldDelegate et nous avons ici la sélection de champ suivante basée sur l'incrémentation de la valeur de la balisela source
UITextView
. Une idée de comment faire cela en combinaison?UITextField
saisie de texte, le premier est (entrez une seule ligne de texte), l'autre estUITextView
(entrez plusieurs lignes de texte).UITextView
ne répond évidemment pas à ce code mais il peut être utilisé dans les formulaires.Après avoir quitté un champ de texte, vous appelez [otherTextField devientFirstResponder] et le champ suivant obtient le focus.
Cela peut en fait être un problème délicat à résoudre car, souvent, vous souhaiterez également faire défiler l'écran ou ajuster la position du champ de texte afin qu'il soit facile à voir lors de la modification. Assurez-vous simplement de faire beaucoup de tests en entrant et en sortant des champs de texte de différentes manières et en partant tôt (donnez toujours à l'utilisateur la possibilité de fermer le clavier au lieu d'aller au champ suivant, généralement avec "Terminé" dans la barre de navigation)
la source
la source
Une méthode très simple pour fermer le clavier lorsque vous appuyez sur le bouton «Terminé» est:
Créer une nouvelle IBAction dans l'en-tête
Dans le fichier d'implémentation (fichier .m), ajoutez la méthode suivante:
Ensuite, lorsque vous venez de lier l'IBAction au champ de texte - liez à l'événement 'Did End On Exit'.
la source
Définissez d'abord la touche de retour du clavier dans xib, sinon vous pouvez écrire du code
viewdidload
:la source
Je suis surpris du nombre de réponses qui ne parviennent pas à comprendre un concept simple: la navigation dans les contrôles de votre application n'est pas quelque chose que les vues elles-mêmes devraient faire. C'est le travail du contrôleur de décider quel contrôle faire le prochain premier répondant.
De plus, la plupart des réponses ne s'appliquent qu'à la navigation vers l'avant, mais les utilisateurs peuvent également vouloir revenir en arrière.
Voici donc ce que j'ai trouvé. Votre formulaire doit être géré par un contrôleur de vue, et les contrôleurs de vue font partie de la chaîne de répondeurs. Vous êtes donc parfaitement libre d'implémenter les méthodes suivantes:
Une logique supplémentaire pour faire défiler les répondeurs hors écran visibles à l'avance peut s'appliquer.
Un autre avantage de cette approche est que vous n'avez pas besoin de sous-classer toutes sortes de contrôles que vous souhaitez afficher (comme les
UITextField
s), mais que vous pouvez gérer la logique au niveau du contrôleur, où, soyons honnêtes, est le bon endroit pour le faire .la source
J'ai ajouté à la réponse de PeyloW au cas où vous cherchez à implémenter une fonctionnalité de bouton précédent / suivant:
Où vous sous-classez l'UIV comme ceci:
la source
Salut à tous s'il vous plaît voir celui-ci
la source
J'ai essayé de résoudre ce problème en utilisant une approche plus sophistiquée basée sur l'attribution de chaque cellule (ou
UITextField
) dans uneUITableView
valeur de balise unique qui peut être récupérée plus tard: activate-next-uitextfield-in-uitableview-iosJ'espère que ça aide!
la source
Je viens de créer un nouveau pod lorsque j'ai affaire à ce truc GNTextFieldsCollectionManager . Il gère automatiquement le prochain / dernier problème textField et est très facile à utiliser:
Récupère tous les champs de texte triés en apparaissant dans la hiérarchie des vues (ou par balises), ou vous pouvez spécifier votre propre tableau de textFields.
la source
Solution dans Swift 3.1, après avoir connecté vos champs de texte IBOutlets définissez votre délégué de champs de texte dans viewDidLoad, puis parcourez votre action dans textFieldShouldReturn
la source
Si quelqu'un veut comme ça. Je pense que c'est le plus proche des exigences demandées en question
Voici comment j'ai implémenté celui-ci
Ajoutez une vue accessoire pour chaque champ de texte pour lequel vous souhaitez effectuer la configuration, en utilisant
Utilisez les fonctions suivantes pour gérer les taps
Vous devrez donner aux balises textFields dans l'ordre dans lequel vous souhaitez que le bouton suivant / précédent réponde.
la source
Je préfère plutôt:
Dans le fichier NIB, je raccorde les textFields dans l'ordre souhaité à ce tableau inputFields. Après cela, je fais un test simple pour l'index de l'UITextField qui signale que l'utilisateur a tapé sur retour:
la source
la source
J'avais environ 10+ UITextField dans mon story-board et la façon dont j'ai activé la fonctionnalité suivante était de créer un tableau de UITextField et de faire du prochain UITextField le premier répondeur. Voici le fichier d'implémentation:
la source
Cela a fonctionné pour moi dans Xamarin.iOS / Monotouch. Modifiez le bouton du clavier sur Suivant, passez le contrôle au UITextField suivant et masquez le clavier après le dernier UITextField.
À l'intérieur du ViewDidLoad, vous aurez:
Si vos TextFields n'ont pas de balise, définissez-le maintenant:
et juste l'appel
la source
C'est une solution simple et rapide, sans utiliser de tag, pas de trucs de storyboard ...
Utilisez simplement cette extension:
Et appelez-le comme ceci (par exemple) avec votre délégué textfield:
la source
Une manière plus sûre et plus directe, en supposant:
Swift 4.1:
la source
dans textFieldShouldReturn, vous devez vérifier que le champ de texte sur lequel vous vous trouvez n'est pas le dernier lorsqu'il clique ensuite et si ce n'est pas le cas, ne fermez pas le clavier.
la source
Ceci est un ancien message, mais a un rang de page élevé, je vais donc carillon avec ma solution.
J'ai eu un problème similaire et j'ai fini par créer une sous-classe de
UIToolbar
pour gérer la fonctionnalité suivante / précédente / terminée dans une table dynamique avec des sections: https://github.com/jday001/DataEntryToolbarVous définissez la barre d'outils comme inputAccessoryView de vos champs de texte et les ajoutez à son dictionnaire. Cela vous permet de les parcourir en avant et en arrière, même avec du contenu dynamique. Il existe des méthodes déléguées si vous souhaitez déclencher votre propre fonctionnalité lorsque la navigation textField se produit, mais vous n'avez pas à gérer la gestion des balises ou l'état du premier répondant.
Il y a des extraits de code et un exemple d'application sur le lien GitHub pour vous aider avec les détails d'implémentation. Vous aurez besoin de votre propre modèle de données pour garder une trace des valeurs à l'intérieur des champs.
la source
Sans utiliser de balises et sans ajouter de propriété pour nextField / nextTextField, vous pouvez essayer ceci pour émuler TAB, où "testInput" est votre champ actif actuel:
la source
J'utilise la réponse de Michael G. Emmons depuis environ un an maintenant, ça marche très bien. J'ai remarqué récemment que l'appel à resignFirstResponder puis à devientFirstResponder immédiatement peut provoquer un "pépin" du clavier, disparaissant puis apparaissant immédiatement. J'ai légèrement changé sa version pour ignorer le resignFirstResponder si le nextField est disponible.
la source