Заставить текстовое поле iOS SwiftUI отклонять неверный числовой ввод

#ios #swiftui #textfield

#iOS #swiftui #текстовое поле

Вопрос:

Мое текстовое поле iOS SwiftUI позволяет пользователю вводить значение Int. Если пользователь вводит неверные символы ввода, такие как «abc» вместо «123», я хотел бы отобразить неверные символы в сообщении об ошибке в моем тексте (где я написал TextField.text), и я хотел бы сохранить клавиатуру текстового поля на экране, пока пользователь не введет правильный ввод. Как это сделать? Заранее благодарю вас. Xcode 11.6 в macOS Catalina 10.15.6.

 struct ContentView: View {
    @State private var value: Int? = nil;
    @State private var text: String = "";

    var body: some View {
        VStack {
            TextField(
                "Enter an integer:",
                value: $value,
                formatter: NumberFormatter(),
                onCommit: {
                    guard let value: Int = self.value else {
                        self.text = "Bad input "(textField.text)".";
                        //Do not dismiss the TextField's keyboard.
                        return;
                    }
                    //Dismiss the TextField's keyboard.
                    self.text = "The product is (2 * value).";
                }
            )
            .keyboardType(.numbersAndPunctuation)
            .textFieldStyle(RoundedBorderTextFieldStyle())

            Text(text)
        }
        .padding([.leading, .trailing], 16)
    }
}

  

Комментарии:

1. Текстовое поле на данный момент не позволяет реализовать такую функциональность. Вам нужно использовать representable поверх UITextField.

Ответ №1:

Приведенный ниже код дает вам представление о проверке вашего текста внутри текстового поля во время ввода пользователем.

 struct ContentView: View {

@State private var textNumber    : String = ""
@State private var isNumberValid : Bool   = true

var body: some View {
    VStack {
        
        TextField("Enter an integer:", text: numberValidator())
            .keyboardType(.numbersAndPunctuation)
            .textFieldStyle(RoundedBorderTextFieldStyle())
        
        if !self.isNumberValid {
            Text("Bad input "(textNumber)".")
                .font(.callout)
                .foregroundColor(Color.red)
        }
    }
    .padding([.leading, .trailing], 16)
}

private func numberValidator() -> Binding<String> {
    return Binding<String>(
        get: {
            return self.textNumber
    }) {
        if CharacterSet(charactersIn: "1234567890").isSuperset(of: CharacterSet(charactersIn: $0)) {
            self.textNumber = $0
            self.isNumberValid = true
        } else {
            self.textNumber = $0
            //self.textNumber = ""
            self.isNumberValid = false
        }
    }
  }
}
  

Ответ №2:

Следующий фрагмент кода дает вам представление о проверке вашего текста внутри текстового поля, когда пользователь вводит текст, используя Get, Set значение

     let checkValue = Binding<String>(
        get: {
            self.value
        },
        set: {
            self.value = $0
        }
    )
  

Я надеюсь, что это может вам помочь

 struct ContentView: View {
    @State private var value: String = ""
    @State private var text: String = ""

    var body: some View {
        let checkValue = Binding<String>(
            get: {
               self.value
            },
            set: {
                self.value = $0
            }
        )

        return VStack {
            TextField("Enter an integer:",text: checkValue)
            .keyboardType(.numbersAndPunctuation)
            .textFieldStyle(RoundedBorderTextFieldStyle())

            Text("Bad interger: (Int(self.value) != nil ? "" : self.value)").foregroundColor(Color.red)
        
        }
        .padding([.leading, .trailing], 16)
    }
}