SwiftUI表单验证:内部验证程序始终会重置

时间:2019-11-01 04:07:54

标签: ios swift swiftui

我正在尝试创建一种方法来验证用户输入并在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中验证表单并产生输出?

0 个答案:

没有答案