¿Cómo puedo navegar por todos mis campos de texto con el botón "Siguiente" en el teclado del iPhone?
El último campo de texto debe cerrar el teclado.
He configurado los botones IB (Siguiente / Listo) pero ahora estoy atascado.
Implementé la acción textFieldShouldReturn pero ahora los botones Siguiente y Listo cierran el teclado.
ios
objective-c
iphone
phx
fuente
fuente
Respuestas:
En Cocoa para Mac OS X, tiene la siguiente cadena de respuesta, donde puede preguntar al campo de texto en qué control debe centrarse a continuación. Esto es lo que hace que el tabulado entre campos de texto funcione. Pero dado que los dispositivos iOS no tienen teclado, solo toquen, este concepto no ha sobrevivido a la transición a Cocoa Touch.
Esto puede hacerse fácilmente de todos modos, con dos supuestos:
UITextField
están en la misma vista principal.Suponiendo esto, puede anular textFieldShouldReturn: como esto:
Agregue un poco más de código, y los supuestos también pueden ignorarse.
Swift 4.0
Si la vista general del campo de texto será un UITableViewCell, el siguiente respondedor será
fuente
UITableViewCell
. Debería acceder a la asociadaUITableView
y obtener la celda que contiene el campo de texto que está buscando.UITextFieldDelegate
y establecer los delegados de campos de texto.Hay una solución mucho más elegante que me sorprendió la primera vez que la vi. Beneficios:
UITextField
yUITextView
controles - o cualquier entrada de control de la interfaz de usuario del tecladoCree una subclase UITextField que tenga una
IBOutlet
propiedad llamada nextField. Aquí está el encabezado:Y aquí está la implementación:
En su controlador de vista, creará el
-textFieldShouldReturn:
método delegado:En IB, cambie sus UITextFields para usar la
SOTextField
clase. A continuación, también en IB, configure el delegado para cada uno de los 'SOTextFields' al 'Propietario del archivo' (que es justo donde coloca el código para el método de delegado: textFieldShouldReturn). La belleza de este diseño es que ahora puede simplemente hacer clic derecho en cualquier campo de texto y asignar la salida nextField al siguienteSOTextField
objeto que desea que sea el próximo respondedor.Además, puede hacer cosas geniales como recorrer los campos de texto para que después de que el último pierda el foco, el primero reciba el foco nuevamente.
Esto se puede extender fácilmente para asignar automáticamente el
returnKeyType
deSOTextField
aUIReturnKeyNext
si hay un nextField asignado, una cosa menos se configura manualmente.fuente
UITableView
. Aunque tengoIBOutlet
propiedades en el controlador de vista para cada campo de texto, no me permite vincular lanextField
propiedad a esas propiedades en el Propietario del archivo. ¿Algún consejo sobre cómo puedo hacer que funcione en este escenario?textField1.nextField = textField2; textField2.nextField = textField3;
, etc.Aquí hay uno sin delegación:
ObjC:
Funciona utilizando la
UIControlEventEditingDidEndOnExit
UITextField
acción (en su mayoría desconocida) .También puede conectarlo fácilmente en el guión gráfico, por lo que no se requiere delegación ni código.
Editar: en realidad no puedo encontrar la manera de conectar esto en el guión gráfico.
becomeFirstResponder
no parece ser una acción ofrecida para este evento de control, lo cual es una pena. Aún así, puede conectar todos sus campos de texto a una sola acción en su ViewController que luego determina a qué TextField sebecomeFirstResponder
basa en el remitente (aunque entonces no es tan elegante como la solución programática anterior, así que IMO lo haga con el código anteriorviewDidLoad
).fuente
[tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
. Gracias @mxcl.Aquí está mi solución para este problema.
Para resolver esto (y porque odio depender de las etiquetas para hacer cosas) decidí agregar una propiedad personalizada al objeto UITextField. En otras palabras, creé una categoría en UITextField como esta:
UITextField + Extended.h
UITextField + Extended.m
Ahora, así es como lo uso:
E implemente el método textFieldShouldReturn:
Ahora tengo una especie de lista vinculada de UITextField, cada uno sabe quién es el próximo en la línea.
Espero que ayude.
fuente
Una extensión rápida que aplica la respuesta de mxcl para hacer esto particularmente fácil (adaptado a swift 2.3 por Traveler):
Es fácil de usar:
La extensión establecerá el botón de retorno en "Siguiente" para todos excepto el último campo y en "Listo" para el último campo, y cambiará el enfoque / descartará el teclado cuando se toquen.
Swift <2.3
SWIFT 3: use así:
fuente
UITextFieldDelegate
e implementefunc textFieldDidEndEditing(textField: UITextField)
. Solo vuelve temprano sitextField != field3
.Una forma más consistente y robusta es usar NextResponderTextField . Puede configurarlo totalmente desde el generador de interfaces sin necesidad de configurar el delegado o usarlo
view.tag
.Todo lo que necesitas hacer es
UITextField
serNextResponderTextField
nextResponderField
para que apunte al siguiente respondedor, puede ser cualquier cosaUITextField
o cualquierUIResponder
subclase. También puede ser un UIButton y la biblioteca es lo suficientemente inteligente como para activar elTouchUpInside
evento del botón solo si está habilitado.Aquí está la biblioteca en acción:
fuente
Me gustan las soluciones OO que ya han sido sugeridas por Anth0 y Answerbot. Sin embargo, estaba trabajando en un POC rápido y pequeño, por lo que no quería saturar las cosas con subclases y categorías.
Otra solución simple es crear una matriz NSA de campos y buscar el siguiente campo cuando presiona Siguiente. No es una solución OO, pero es rápida, simple y fácil de implementar. Además, puede ver y modificar el pedido de un vistazo.
Aquí está mi código (construido sobre otras respuestas en este hilo):
fuente
Aquí hay una implementación de tabulación usando una categoría en UIControl. Esta solución tiene todas las ventajas de los métodos de Michael y Anth0, pero funciona para todos los controles UIC, no solo para
UITextField
s. También funciona a la perfección con Interface Builder y storyboards.Fuente y aplicación de muestra: repositorio de GitHub para UIControlsWithTabbing
Uso:
Encabezamiento:
Implementación:
fuente
He probado muchos códigos y finalmente, esto funcionó para mí en Swift 3.0 Latest [marzo de 2017]
La
ViewController
clase debe heredarseUITextFieldDelegate
para que este código funcione.Agregue el campo de texto con el número de etiqueta adecuado y este número de etiqueta se utiliza para llevar el control al campo de texto apropiado en función del número de etiqueta incremental asignado a él.
En el código anterior, el
returnKeyType = UIReturnKeyType.next
lugar hará que la tecla de retorno del teclado numérico se muestre, yaNext
que también tiene otras opciones,Join/Go
etc., según su aplicación, cambie los valores.Este
textFieldShouldReturn
es un método controlado por UITextFieldDelegate y aquí tenemos la siguiente selección de campo basada en el incremento del valor de la etiquetafuente
UITextView
. ¿Alguna idea de cómo hacer esto en combinación?UITextField
(ingrese una sola línea de texto), la otra esUITextView
(ingrese varias líneas de texto).UITextView
obviamente no responde a este código pero puede usarse en formularios.Después de salir de un campo de texto, llama a [otherTextField BecomeFirstResponder] y el siguiente campo se enfoca.
En realidad, este puede ser un problema difícil de tratar, ya que a menudo también querrá desplazarse por la pantalla o ajustar la posición del campo de texto para que sea fácil de ver al editar. Solo asegúrate de hacer muchas pruebas al entrar y salir de los campos de texto de diferentes maneras y también salir temprano (siempre da al usuario la opción de cerrar el teclado en lugar de pasar al siguiente campo, generalmente con "Listo" en la barra de navegación)
fuente
fuente
Un método muy sencillo para cerrar el teclado cuando se presiona el botón 'Listo' es:
Cree una nueva IBAction en el encabezado
En el archivo de implementación (archivo .m) agregue el siguiente método:
Luego, cuando venga a vincular la IBAction con el campo de texto, vincule al evento 'Terminó al salir'.
fuente
Primero configure la tecla de retorno del teclado en xib, de lo contrario puede escribir código en
viewdidload
:fuente
Me sorprende la cantidad de respuestas que aquí no entiendo un concepto simple: navegar a través de los controles en su aplicación no es algo que las vistas mismas deberían hacer. Es el trabajo del controlador decidir qué control hacer el próximo primer respondedor.
Además, la mayoría de las respuestas solo se aplican a la navegación hacia adelante, pero los usuarios también pueden querer retroceder.
Así que esto es lo que se me ocurrió. Su formulario debe ser administrado por un controlador de vista, y los controladores de vista son parte de la cadena de respuesta. Así que eres perfectamente libre de implementar los siguientes métodos:
Se puede aplicar una lógica adicional para desplazarse fuera de la pantalla de los respondedores visibles de antemano.
Otra ventaja de este enfoque es que no necesita subclasificar todo tipo de controles que desee mostrar (como
UITextField
s), sino que puede administrar la lógica a nivel de controlador, donde, seamos honestos, es el lugar correcto para hacerlo .fuente
He agregado a la respuesta de PeyloW en caso de que esté buscando implementar una funcionalidad de botón anterior / siguiente:
Donde subclases la UIView así:
fuente
Hola a todos por favor vean este
fuente
Traté de resolver este problema utilizando un enfoque más sofisticado basado en la asignación de cada celda (o
UITextField
) en unUITableView
valor de etiqueta único que luego se puede recuperar: active-next-uitextfield-in-uitableview-ios¡Espero que esto ayude!
fuente
Acabo de crear un nuevo Pod al tratar con estas cosas GNTextFieldsCollectionManager . Maneja automáticamente el siguiente / último problema de textField y es muy fácil de usar:
Toma todos los campos de texto ordenados al aparecer en la jerarquía de vistas (o por etiquetas), o puede especificar su propia matriz de campos de texto.
fuente
Solución en Swift 3.1, después de conectar sus campos de texto IBOutlets configure su delegado de campos de texto en viewDidLoad, y luego navegue su acción en textFieldShouldReturn
fuente
Si alguien quiere así. Creo que este es el más cercano a los requisitos solicitados en cuestión
Así es como he implementado este
Agregue la vista de accesorios para cada campo de texto para el que desea la configuración, utilizando
Use las siguientes funciones para manejar grifos
Deberá asignar las etiquetas textFields en secuencia en la que desea que responda el botón siguiente / anterior.
fuente
Prefiero preferir:
En el archivo NIB, engancho los textFields en el orden deseado en esta matriz inputFields. Después de eso, hago una prueba simple para el índice del UITextField que informa que el usuario presionó return:
fuente
fuente
Tenía alrededor de 10+ UITextField en mi guión gráfico y la forma en que habilité la siguiente funcionalidad fue creando una matriz de UITextField y convirtiendo al siguiente UITextField en el primer Respondedor. Aquí está el archivo de implementación:
fuente
Esto funcionó para mí en Xamarin.iOS / Monotouch. Cambie el botón del teclado a Siguiente, pase el control al siguiente UITextField y oculte el teclado después del último UITextField.
Dentro de ViewDidLoad tendrás:
Si sus TextFields no tienen una etiqueta, configúrela ahora:
y solo la llamada
fuente
Esta es una solución simple en forma rápida, sin usar etiquetas, sin trucos del guión gráfico ...
Solo usa esta extensión:
Y llámelo así (por ejemplo) con su delegado de campo de texto:
fuente
Una forma más segura y directa, suponiendo:
Swift 4.1:
fuente
en textFieldShouldReturn debe verificar que el campo de texto en el que se encuentra actualmente no sea el último cuando hacen clic en Siguiente y si no se cierra el teclado.
fuente
Esta es una publicación antigua, pero tiene un alto rango de página, por lo que intervendré con mi solución.
Tuve un problema similar y terminé creando una subclase de
UIToolbar
para administrar la funcionalidad siguiente / anterior / terminada en una tabla dinámica Ver con secciones: https://github.com/jday001/DataEntryToolbarEstablece la barra de herramientas como inputAccessoryView de sus campos de texto y los agrega a su diccionario. Esto le permite recorrerlos hacia adelante y hacia atrás, incluso con contenido dinámico. Existen métodos delegados si desea activar su propia funcionalidad cuando se realiza la navegación textField, pero no tiene que ocuparse de administrar ninguna etiqueta o estado del primer respondedor.
Hay fragmentos de código y una aplicación de ejemplo en el enlace de GitHub para ayudar con los detalles de implementación. Necesitará su propio modelo de datos para realizar un seguimiento de los valores dentro de los campos.
fuente
Sin etiquetas de uso y sin agregar una propiedad para nextField / nextTextField, puede intentar esto para emular TAB, donde "testInput" es su campo activo actual:
fuente
He estado usando la respuesta de Michael G. Emmons durante aproximadamente un año, funciona muy bien. Hace poco noté que llamar a resignFirstResponder y luego convertirse enFirstResponder de inmediato puede hacer que el teclado "falle", desaparezca y luego aparezca de inmediato. Cambié su versión ligeramente para omitir el resignFirstResponder si nextField está disponible.
fuente