忽略 swift UI 中的首次渲染

问题描述 投票:0回答:1

我试图在文本字段下方显示错误。如果文本字段的值少于 2 个字符,我们会显示错误。

唯一的问题是该值必须初始化,即使用空字符串,这会在用户交互开始之前就触发错误。附上代码供参考。

class ErrorViewModel: ObservableObject{
    @Published var value: String
    var errorToShow: String {
        if(value.count < 2){
            return "invalid input"
        }else{
            return ""
        }
    }
    init(value: String) {
        self.value = value
    }
}
struct ErrorView: View {
    @ObservedObject var errorVm: ErrorViewModel
    var body: some View {
        Text(errorVm.errorToShow)
    }
}

struct TextFieldView : View {
    @State var value: String
    var body: some View {
        TextField(
            "Enter yor name",
            text: $value
        )
        ErrorView(errorVm: ErrorViewModel.init(value: value))
    }
}

#Preview {
    TextFieldView(value: "")
}

我只想忽略具有默认值的第一个渲染。这样当用户交互开始时就会显示错误。

swift swiftui data-binding observableobject
1个回答
0
投票

我建议将

value
声明为
String?
而不是
String
并在第一次渲染中将
value
设置为
nil

class ErrorViewModel: ObservableObject{
    @Published var value: String?
    var errorToShow: String {
        if let value, value.count < 2 {
            return "invalid input"
        }else{
            return ""
        }
    }
    init(value: String?) {
        self.value = value
    }
}
struct ErrorView: View {
    @ObservedObject var errorVm: ErrorViewModel
    var body: some View {
        Text(errorVm.errorToShow)
    }
}

struct TextFieldView : View {
    @State var value: String?
    var body: some View {
        TextField(
            "Enter yor name",
            text: Binding(get: { value ?? "" }, set: { value = $0 })
        )
        ErrorView(errorVm: ErrorViewModel.init(value: value))
    }
}

#Preview {
    TextFieldView(value: nil)
}
© www.soinside.com 2019 - 2024. All rights reserved.