Soy nuevo en SwiftUI e iOS, y estoy tratando de crear un campo de entrada que solo acepte números.
TextField("Total number of people", text: $numOfPeople)
El TextField
actualmente permite caracteres alfabéticos, ¿cómo puedo hacer para que el usuario sólo puede introducir números?
swiftui
swiftui-form
Lupyana Mbembati
fuente
fuente
Respuestas:
Puede configurar el tipo de teclado en el
TextField
que limitará lo que las personas pueden escribir.La documentación de Apple se puede encontrar aquí , y puede ver una lista de todos los tipos de teclado compatibles aquí .
fuente
Aunque mostrar un teclado numérico es un buen primer paso, en realidad no evita que se ingresen datos incorrectos:
Lo que realmente quieres hacer es desinfectar la entrada, así:
Cada vez que
numOfPeople
cambia, los valores no numéricos se filtran y el valor filtrado se compara para ver sinumOfPeople
debe actualizarse por segunda vez, sobrescribiendo la entrada incorrecta con la entrada filtrada.Tenga en cuenta que el
Just
editor requiere que ustedimport Combine
.EDITAR:
Para explicar al
Just
editor, considere el siguiente esquema conceptual de lo que ocurre cuando cambia el valor enTextField
:TextField
toma aBinding
a aString
, cuando se cambia el contenido del campo, también escribe ese cambio nuevamente en la@State
variable.@State
cambia, SwiftUI vuelve a calcular labody
propiedad de la vista.body
cálculo,Just
se crea un editor. Combine tiene muchos editores diferentes para emitir valores a lo largo del tiempo, pero elJust
editor toma "solo" un solo valor (el nuevo valor denumberOfPeople
) y lo emite cuando se le solicita.onReceive
método convierte aView
un suscriptor en un editor, en este caso, elJust
editor que acabamos de crear. Una vez suscrito, solicita inmediatamente los valores disponibles del editor, de los cuales solo hay uno, el nuevo valor denumberOfPeople
.onReceive
suscriptor recibe un valor, ejecuta el cierre especificado. Nuestro cierre puede terminar de dos maneras. Si el texto ya es solo numérico, entonces no hace nada. Si el texto filtrado es diferente, se escribe en la@State
variable, que comienza el ciclo nuevamente, pero esta vez el cierre se ejecutará sin modificar ninguna propiedad.Consulte Uso de Combinar para obtener más información.
fuente
Just
editor.No necesita usar
Combine
yonReceive
, también puede usar este código:Desafortunadamente, también hay un pequeño parpadeo, por lo que también puede ver los caracteres no permitidos por un tiempo muy corto (en mi opinión, un poco más corto como el camino con
Combine
)fuente
Otro enfoque quizás sea crear una Vista que envuelva la vista TextField y que contenga dos valores: una variable privada que contenga la Cadena ingresada y un valor enlazable que contenga el Doble equivalente. Cada vez que el usuario escribe un carácter, intenta actualizar el Doble.
Aquí hay una implementación básica:
Podrías usarlo así:
Este es un ejemplo básico: es posible que desee agregar funcionalidad para mostrar una advertencia por una entrada deficiente, y tal vez verificaciones de límites, etc.
fuente
La
ViewModifier
versión de la @ John M. respuesta .fuente