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 TextFieldactualmente 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
TextFieldque 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
numOfPeoplecambia, los valores no numéricos se filtran y el valor filtrado se compara para ver sinumOfPeopledebe actualizarse por segunda vez, sobrescribiendo la entrada incorrecta con la entrada filtrada.Tenga en cuenta que el
Justeditor requiere que ustedimport Combine.EDITAR:
Para explicar al
Justeditor, considere el siguiente esquema conceptual de lo que ocurre cuando cambia el valor enTextField:TextFieldtoma aBindinga aString, cuando se cambia el contenido del campo, también escribe ese cambio nuevamente en la@Statevariable.@Statecambia, SwiftUI vuelve a calcular labodypropiedad de la vista.bodycálculo,Justse crea un editor. Combine tiene muchos editores diferentes para emitir valores a lo largo del tiempo, pero elJusteditor toma "solo" un solo valor (el nuevo valor denumberOfPeople) y lo emite cuando se le solicita.onReceivemétodo convierte aViewun suscriptor en un editor, en este caso, elJusteditor que acabamos de crear. Una vez suscrito, solicita inmediatamente los valores disponibles del editor, de los cuales solo hay uno, el nuevo valor denumberOfPeople.onReceivesuscriptor 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@Statevariable, 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
Justeditor.No necesita usar
CombineyonReceive, 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
ViewModifierversión de la @ John M. respuesta .fuente