0

I have a bunch of textfield that only accept numbers. But how can I force the user to only input one single digit and not multiple. I want the input to be a number between 0 and 9.

Any ideas?

This is the setup for one of the textfields:

CocoaTextField(pin1default, text: $pin1)
    .isFirstResponder(currentFocus == 0)
    .font(.system(size: 18, weight: .bold))
    .lineLimit(1)
    .frame(maxWidth: 50, maxHeight: 50, alignment: .center)
    .multilineTextAlignment(.center)
    .overlay(
        RoundedRectangle(cornerRadius: 6)
            .strokeBorder(Color.gray.opacity(0.1), lineWidth: 2, antialiased: true)
    )
    .keyboardType(.numberPad)
    .onChange(of: pin1, perform: { value in
        if value.count > 0 {
            currentFocus += 1
        }
    })
    .onTapGesture {
        currentFocus = 0
        pin1default = ""
    }
Nick
  • 219
  • 4
  • 15
  • Does this answer your question? [SwiftUI: Is it possible to automatically move to the next textfield after 1 character is entered?](https://stackoverflow.com/questions/57188098/swiftui-is-it-possible-to-automatically-move-to-the-next-textfield-after-1-char) – lorem ipsum Oct 17 '22 at 15:40

1 Answers1

0

You could do something like this:

func validateTextField(_ number: String) -> Bool {
    let numberPredicate = NSPredicate(format: "SELF MATCHES %@", "^[0-9]*$")
    return numberPredicate.evaluate(with: number) ? true : false
}

struct ContentView: View {
    @State var number = ""

    var body: some View {
        TextField("Number", text: $number)
            .onChange(of: number) { newNumber in
                if !validateTextField(newNumber) && newNumber.count <= 1 {
                    number = ""
                } else {
                    let value = String(newNumber.prefix(1))
                    if newNumber != value {
                        number = value
                    }
                }
            }
    }
}
bjorn.lau
  • 774
  • 5
  • 16