Проверка формы SwiftUI: внутренние валидаторы всегда сбрасываются - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь создать способ проверки ввода пользователя и получения привязываемого вывода в 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...