You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何修改带@符号的TextField邮箱文本颜色?

SwiftUI TextField输入邮箱变蓝色?这么解决就行

SwiftUI的TextField会自动把输入的邮箱识别成可点击链接,应用系统默认的蓝色样式,这个样式优先级比你设置的foregroundColor(.gray)更高,所以直接改文字颜色没用。给你两个靠谱的解决办法:

方法一:封装原生UITextField(全iOS版本通用)

通过UIViewRepresentable封装原生UITextField,要么直接关闭邮箱链接识别,要么修改链接的显示样式:

struct CustomTextField: UIViewRepresentable {
    @Binding var text: String
    let placeholder: String
    let onEditingChanged: (Bool) -> Void

    func makeUIView(context: Context) -> UITextField {
        let textField = UITextField()
        textField.placeholder = placeholder
        textField.font = .systemFont(ofSize: 16)
        textField.textColor = .gray
        
        // 选项1:彻底关闭邮箱链接识别
        textField.dataDetectorTypes = []
        
        // 选项2:保留识别但改成灰色无下划线
        // let linkStyles: [NSAttributedString.Key: Any] = [
        //     .foregroundColor: UIColor.gray,
        //     .underlineStyle: NSUnderlineStyle.none.rawValue
        // ]
        // textField.linkTextAttributes = linkStyles
        
        textField.delegate = context.coordinator
        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        if uiView.text != text {
            uiView.text = text
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UITextFieldDelegate {
        let parent: CustomTextField

        init(_ parent: CustomTextField) {
            self.parent = parent
        }

        func textFieldDidBeginEditing(_ textField: UITextField) {
            parent.onEditingChanged(true)
        }

        func textFieldDidEndEditing(_ textField: UITextField) {
            parent.text = textField.text ?? ""
            parent.onEditingChanged(false)
        }
    }
}

替换原来的TextField使用即可:

CustomTextField(text: $Useremail, placeholder: "exampl@email.com", onEditingChanged: { editing in
    if !editing {
        Error = !isEmailValid
    }
})

方法二:iOS16+ 用AttributedString直接控制样式

如果你的App只支持iOS16及以上版本,直接使用带AttributedString的TextField初始化方法,统一设置所有文本的样式:

@State private var attributedEmail: AttributedString = ""

// 视图中的代码
TextField("exampl@email.com", attributed: $attributedEmail, onEditingChanged: { editing in
    if !editing {
        let plainText = String(attributedEmail.characters)
        Error = !isEmailValid(plainText) // 记得调整你的验证函数参数
    }
})
.font(.system(size: 16))
.onAppear {
    var style = AttributeContainer()
    style.foregroundColor = .gray
    style.link = nil // 直接移除链接属性,也可自定义链接样式
    attributedEmail.mergeAttributes(style)
}

这样输入的邮箱就会稳定显示为灰色,不会被系统自动转为蓝色链接了。

内容的提问来源于stack exchange,提问作者jules

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:39