J'ai défini deux champs TextInput comme suit:
<TextInput
style = {styles.titleInput}
returnKeyType = {"next"}
autoFocus = {true}
placeholder = "Title" />
<TextInput
style = {styles.descriptionInput}
multiline = {true}
maxLength = {200}
placeholder = "Description" />
Mais après avoir appuyé sur le bouton "Suivant" de mon clavier, mon application native ne réagit pas au deuxième champ TextInput. Comment puis-je y parvenir?
Merci!
ios
react-native
andreaswienes
la source
la source
v16.8.0
ou au-dessus, je recommanderais la réponse fournie par @Eli Johnson vers le bas. React a déconseillé de nombreuses utilisations desref
solutions ci-dessous.Réponses:
Réglez la deuxième
TextInput
mise au point, lorsque le précédent deTextInput
l »onSubmitEditing
est déclenchée.Essaye ça
Ajout d'une référence au deuxième TextInput
ref={(input) => { this.secondTextInput = input; }}
Liez la fonction de focus au premier événement onSubmitEditing de TextInput .
onSubmitEditing={() => { this.secondTextInput.focus(); }}
N'oubliez pas de définir blurOnSubmit sur false pour éviter le scintillement du clavier.
blurOnSubmit={false}
la source
onSubmitEditing
convient de mentionner que ce rappel est appelé après l'blur
événement. Ainsi, le clavier peut devenir fou s'il se concentre immédiatement sur l'élément suivant. Il peut donc être utile de définirblurOnSubmit={false}
tous les éléments dans le formulaire, mais de laissertrue
le dernier élément, pour permettre au bouton Terminé de brouiller la dernière entrée.blurOnSubmit={false}
pour empêcher le scintillement du clavier a provoqué l'arrêt de tout fonctionnement, quiconque sait ce qui se passe?focus
Si vous ne parvenez pas à faire fonctionner, assurez-vous de ne pas utiliser de wrapper pour leTextInput
composant. Si vous avez unCustomTextInput
composant say qui encapsuleTextInput
, vous devez implémenter desTextInput
méthodes de flou et de focus pour ce composant afin qu'il fonctionne comme prévu.Vous pouvez le faire sans utiliser de références . Cette approche est préférée, car les références peuvent conduire à un code fragile . Les documents React conseillent de trouver d'autres solutions lorsque cela est possible:
À la place, nous utiliserons une variable d'état pour focaliser le deuxième champ de saisie.
Ajoutez une variable d'état que nous passerons comme accessoire à
DescriptionInput
:Définissez une méthode de gestionnaire qui définira cette variable d'état sur true:
Après avoir soumis / appuyé sur Entrée / Suivant le
TitleInput
, nous appelleronshandleTitleInputSubmit
. Cela deviendrafocusDescriptionInput
vrai.DescriptionInput
L'focus
hélice est définie sur notrefocusDescriptionInput
variable d'état. Ainsi, lorsque desfocusDescriptionInput
modifications (à l'étape 3),DescriptionInput
seront rendues avecfocus={true}
.C'est une bonne façon d'éviter d'utiliser des références, car les références peuvent conduire à un code plus fragile :)
EDIT: h / t à @LaneRettig pour avoir souligné que vous devrez encapsuler le React Native TextInput avec quelques accessoires et méthodes supplémentaires pour le faire répondre à
focus
:la source
Depuis React Native 0.36, l'appel
focus()
(comme suggéré dans plusieurs autres réponses) sur un nœud de saisie de texte n'est plus pris en charge. À la place, vous pouvez utiliser leTextInputState
module de React Native. J'ai créé le module d'assistance suivant pour faciliter cela:Vous pouvez alors appeler la
focusTextInput
fonction sur n'importe quel "ref" de aTextInput
. Par exemple:la source
<Field ... onSubmitEditing={() => focusTextInput(this._password)} />
et ref devrait être comme ça<Field ... withRef refName={e => this._password = e}/>
calling focus() on a text input node isn't supported any more
=> revendication audacieuse, source? L'appelfocus()
fonctionne correctement avec v0.49.5 +TextInputState
n'est pas documenté pendantfocus()
etblur()
est mentionné: facebook.github.io/react-native/releases/next/docs/…J'ai créé une petite bibliothèque qui fait cela, aucun changement de code nécessaire autre que le remplacement de votre vue d'habillage et l'importation de TextInput:
https://github.com/zackify/react-native-autofocus
Expliqué en détail ici: https://zach.codes/autofocus-inputs-in-react-native/
la source
Je pensais que je partagerais ma solution en utilisant un composant fonctionnel ... ' cela ' n'est pas nécessaire!
Voici un exemple de mon composant:
Je ne sais pas, j'espère que cela aide quelqu'un =)
la source
En utilisant react-native 0.45.1, j'ai également rencontré des problèmes en essayant de mettre l'accent sur un mot de passe TextInput après avoir appuyé sur la touche Entrée d'un nom d'utilisateur TextInput.
Après avoir essayé la plupart des solutions les mieux notées ici sur SO, j'ai trouvé une solution sur github qui répondait à mes besoins: https://github.com/shoutem/ui/issues/44#issuecomment-290724642
Résumer:
Et puis je l'utilise comme ceci:
la source
ref
pourinputRef
... Vous pouvez déposer la totalité de votre composant personnalisé et votre deuxième bloc de code fonctionne en l' état aussi longtemps que vous revenir à l' utilisationref
Pour moi sur RN 0.50.3 c'est possible de cette façon:
Vous devez voir this.PasswordInputRef. _root .focus ()
la source
Si vous utilisez
tcomb-form-native
comme moi, vous pouvez aussi le faire. Voici l'astuce: au lieu de définir les accessoires duTextInput
directement, vous le faites viaoptions
. Vous pouvez vous référer aux champs du formulaire comme:Le produit final ressemble donc à ceci:
(Nous remercions Remcoanker d'avoir publié l'idée ici: https://github.com/gcanti/tcomb-form-native/issues/96 )
la source
C'est ainsi que je l'ai réalisé. Et l'exemple ci-dessous a utilisé l'API React.createRef () introduite dans React 16.3.
Je crois que ceci vous aidera.
la source
Mon scénario est <CustomBoladonesTextInput /> enveloppant un RN <TextInput /> .
J'ai résolu ce problème comme suit:
Ma forme ressemble à:
Sur la définition du composant CustomBoladonesTextInput, je passe le refField à l'accessoire de référence interne comme ceci:
Et le tour est joué. Tout revient à nouveau. J'espère que cela t'aides
la source
Essayez cette solution sur les problèmes GitHub de React Native.
https://github.com/facebook/react-native/pull/2149#issuecomment-129262565
Vous devez utiliser l'accessoire ref pour le composant TextInput.
Ensuite, vous devez créer une fonction qui est appelée sur l'accessoire onSubmitEditing qui déplace le focus sur la deuxième référence TextInput.
la source
Utilisation de références de rappel au lieu des références de chaîne héritées :
la source
Et ajoutez la méthode
onSubmitEditing={() => this.focusTextInput(this.refs.password)}
comme ci-dessous:la source
Pour que la solution acceptée fonctionne si vous vous trouvez
TextInput
dans un autre composant, vous devez «faire apparaître» la référenceref
dans le conteneur parent.la source
dans votre composant:
Remarque: j'ai utilisé
._root
car il s'agit d'une référence à TextInput dans l'entrée NativeBase'Library 'et dans vos entrées de texte comme celle-ci
la source
et ajouter une méthode
la source
Il existe un moyen de capturer des onglets dans un fichier
TextInput
. C'est hacky, mais mieux que rien .Définissez un
onChangeText
gestionnaire qui compare la nouvelle valeur d'entrée avec l'ancienne, en recherchant a\t
. S'il en trouve un, avancez le champ comme indiqué par @boredgamesEn supposant que la variable
username
contient la valeur du nom d'utilisateur etsetUsername
envoie une action pour la modifier dans le magasin (état du composant, magasin redux, etc.), faites quelque chose comme ceci:la source
Voici une solution de réactif pour un composant d'entrée qui a une propriété: focus.
Le champ sera focalisé tant que cet accessoire est défini sur true et n'aura pas de focus tant que cela est faux.
Malheureusement, ce composant doit avoir un: ref défini, je n'ai pas pu trouver d'autre moyen d'appeler .focus () dessus. Je suis heureux des suggestions.
https://gist.github.com/Knotschi/6f97efe89681ac149113ddec4c396cc5
la source
swap!
unatom
type. Selon les documents, ceci est utilisé pour la liaison à React: "Tout composant qui utilise un atome est automatiquement rendu de nouveau lorsque sa valeur change." reagent-project.github.ioSi vous utilisez NativeBase comme composants d'interface utilisateur, vous pouvez utiliser cet exemple
la source