Я пытаюсь создать способ проверки ввода пользователя и получения привязываемого вывода в SwiftUI. То есть, учитывая некоторый набор пользовательского ввода, будь то текстовые поля или другие модели, производят необязательный вывод, который имеет значение, только если ввод пользователя был действительным. Я создал этот упрощенный пример:
struct BindingExperiments: View {
@State var valid: String? {
didSet {
print(valid ?? "nil")
}
}
var body: some View {
VStack {
Subview(validText: $valid)
valid.map { Text("Valid Output! \($0)") }
Button(action: { print(self.valid ?? "Button value is nil.") }) { Text("Show Text") }
}
}
}
struct Subview: View {
@ObservedObject var validator: Validator
var body: some View {
TextField("Enter", text: $validator.enteredText)
}
init(validText: Binding<String?>) {
validator = Validator(output: validText)
}
final class Validator: ObservableObject {
@Published var enteredText = "" {
didSet {
output = (enteredText.count == 8) ? enteredText : nil
}
}
@Binding var output: String?
init(output: Binding<String?>) {
_output = output
}
}
}
В этом примере Subview
занимает место любого пользовательского представления, которое имеет некоторый связываемый вывод. Я могу ввести текст, и Validator
правильно вызывается, и значение valid
@State
в конечном итоге устанавливается, но дополнительный ввод немедленно сбрасывает экземпляр Subview
, теряя состояние и сбрасывая все обратно на пустой ввод. Я вижу ту же проблему и с более сложными примерами.
Итак, как мне избежать этой проблемы или как я должен проверять формы и производить вывод в SwiftUI?