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