Sou novo no swiftUI e iOs, estou tentando criar um campo de entrada que aceite apenas números
TextField("Total number of people", text: $numOfPeople)
o TextField também permite caracteres alfabéticos, como limite o usuário a inserir apenas números?
swiftui
swiftui-form
Lupyana Mbembati
fonte
fonte
Respostas:
Você pode definir o tipo de teclado no
TextField
qual limitará o que as pessoas podem digitar.A documentação da Apple pode ser encontrada aqui e você pode ver uma lista de todos os tipos de teclado suportados aqui .
fonte
Embora mostrar um teclado numérico seja uma boa primeira etapa, na verdade não impede que dados ruins sejam inseridos:
O que você realmente quer fazer é desinfetar a entrada, assim:
Sempre que
numOfPeople
muda, os valores não numéricos são filtrados e o valor filtrado é comparado para ver senumOfPeople
deve ser atualizado uma segunda vez, substituindo a entrada incorreta pela entrada filtrada.Observe que o
Just
editor exige que vocêimport Combine
.EDITAR:
Para explicar o
Just
editor, considere o seguinte esboço conceitual do que ocorre quando você altera o valor emTextField
:TextField
leva umBinding
a umString
, quando o conteúdo do campo é alterado, ele também grava essa mudança de volta na@State
variável.@State
alterada, o SwiftUI recalcula abody
propriedade da exibição.body
cálculo, umJust
editor é criado. Combine tem muitos editores diferentes para emitir valores ao longo do tempo, mas oJust
editor obtém "apenas" um valor único (o novo valor denumberOfPeople
) e o emite quando solicitado.onReceive
método torna umView
assinante um editor, nesse caso, oJust
editor que acabamos de criar. Uma vez inscrito, ele solicita imediatamente quaisquer valores disponíveis ao editor, dos quais existe apenas um, o novo valor denumberOfPeople
.onReceive
assinante recebe um valor, ele executa o fechamento especificado. Nosso fechamento pode terminar de duas maneiras. Se o texto já é apenas numérico, ele não faz nada. Se o texto filtrado for diferente, ele será gravado na@State
variável, que inicia o loop novamente, mas desta vez o fechamento será executado sem modificar nenhuma propriedade.Confira Usando Combinar para mais informações.
fonte
Just
editor.Você não precisa usar
Combine
eonReceive
também pode usar este código:Infelizmente, também há uma pequena oscilação, para que você também possa ver os caracteres não permitidos por um período muito curto (aos meus olhos um pouco mais curto do que o modo
Combine
)fonte
Outra abordagem talvez seja criar uma View que envolva a visualização TextField e contenha dois valores: uma var particular que contenha a String inserida e um valor vinculável que contenha o equivalente Double. Cada vez que o usuário digita um caractere, ele tenta atualizar o Double.
Aqui está uma implementação básica:
Você poderia usá-lo assim:
Este é um exemplo básico - você pode adicionar funcionalidades para mostrar um aviso de entrada ruim e, talvez, verificações de limites etc.
fonte