如何根据 SwiftUI 中的输入更改 TextField 状态?

How can you change TextField state based on input in SwiftUI?

我是 SwiftUI 的新手,所以我希望得到任何帮助!

我正在寻找构建一个 TextField 来显示基于 text 的验证的错误状态。

例如,如果 TextField 用于收集电子邮件,如果 text 不包含 @,则显示错误。假设错误状态会将 TextField 的边框颜色更改为 Color.green

我正在考虑通过验证闭包来解决这个问题,但我仍然不确定如何更改 TextField.

的实际视觉状态

我知道我们可以 - 我应该声明类似 @State var isError 的东西吗?

我也试过将 TextFieldStyle 作为 @State,但这似乎是一个具有关联类型的协议,我无法绕过它:

类似于:

TextField("",
              text: $text,
              onEditingChanged: { _ in
                self.style = CustomErrorStyle()

如果我能解释清楚,请告诉我,谢谢!

$text 的值会不断更新,因此您只需根据当前文本值更新TextField 格式即可。这是一个示例:

struct TextFieldTest: View {
    
    @State var text: String = ""
    
    var body: some View {
        TextField("Placeholder", text: $text)
            .padding()
            .background(
                RoundedRectangle(cornerRadius: 25.0)
                    .stroke(
                        text == "" ?
                        Color.gray :
                        textIsAppropriate() ?
                        Color.green :
                        Color.red
                        , lineWidth: 2.0)
            )
    }
    
    func textIsAppropriate() -> Bool {
        if text.contains("@") {
            return true
        }
        return false
    }
}

当然,如果您希望仅在用户点击按钮时更改格式,@Asperi 上面评论中的解决方案也适用!