#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)
}
}