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
相关产品推荐
相关产品推荐

