SwiftUI TextField 前景色问题

4

我正在尝试制作实时电子邮件验证,但模拟器的行为很奇怪。当电子邮件无效时,它应该是红色的,当电子邮件有效时,文本的颜色应该是黑色的,但某些字符仍然是红色的。

struct EmailText: View {
    
    @State var textFieldValue: String = ""
    
    private func isValid(_ s: String) -> Bool {
        // not real validation function, just for simplicity
        return Int.random(in: 0 ... 1) == 1
    }
    
    var body: some View {
        TextField("", text: $textFieldValue)
            .foregroundColor(isValid(textFieldValue) ? .black : .red)
            .padding()
    }
}

演示

编辑:我已将验证函数从正则表达式更改为简单条件,以排除正则表达式可能存在的问题。


我猜你的正则表达式有误。尝试使用 /^\w+([.-]?\w+)@\w+([.-]?\w+)(.\w{2,3})+$/。 - Allan Garcia
3个回答

6
解决方案:禁用自动更正。
TextField("", text: $textFieldValue)
            .foregroundColor(isValid(textFieldValue) ? .black : .red)
            .padding()
            .autocorrectionDisabled() // <----

很可能是SwiftUI的一个bug,它会导致拼写检查警告的文本高亮和前景色之间产生干扰。


你是最棒的!!! :) 这是一个可行的解决方案。我怀疑当出现"typo"时它会表现很奇怪,但无法确定,因为行为是"随机的"。 - filip.karas

0

这里我有测试过的代码,也许能帮到你

struct Demo1: View {
    @State private var email: String

      @State var emailIsValid: Bool = true

      

      public init(email: String = "")

      {

          self.email = email

      }
    var body: some View {
//        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
        
        
        TextField("Email", text: $email)

            .onChange(of: email) { newValue in

                if(newValue.range(of:"^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", options: .regularExpression) != nil) {

                    self.emailIsValid = true

                    print("valid")

                } else {

                    self.emailIsValid = false

                    print("invalid")

                }

            }

            .foregroundColor(emailIsValid ? Color.green : Color.red)

    }
}

0

确认无误。你的正则表达式错误了。请使用:

/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/

验证电子邮件。


1
Swift不接受这个正则表达式格式。在正则表达式中,我得到了一些“文字中的无效转义序列”。此外,我不确定问题是否在正则表达式中,因为对于相同的电子邮件地址,它有时可以工作(整个文本是黑色的),有时不能。如果您检查代码,则文本应为红色或黑色。正则表达式不应影响部分文本着色。 - filip.karas
通常,正则表达式是由斜杠定义的...你的和我的正则表达式不同之处在于第一个和最后一个斜杠。尝试不使用它们。 - Allan Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接