SwiftUI。如何更改TextField的占位符颜色?

Ily*_*bet 8 swift swiftui

我想更改TextField的占位符颜色,但是找不到它的方法。

我尝试设置foregroundColoraccentColor,但它不会更改占位符的颜色。

这是代码:

TextField("Placeholder", $text)
    .foregroundColor(Color.red)
    .accentColor(Color.green)
Run Code Online (Sandbox Code Playgroud)

也许还没有API?

小智 65

适用于 iOS 16.0 及以上版本

TextField("", text: $viewModel.userName, prompt: Text("Phone, email or username").foregroundColor(.gray))
Run Code Online (Sandbox Code Playgroud)

  • 我们也可以在 iOS 15 中使用它。 (7认同)

小智 31

最终,将内容嵌入 ZStack 的 ViewModifier 更优雅且代码更少:

public struct PlaceholderStyle: ViewModifier {
    var showPlaceHolder: Bool
    var placeholder: String

    public func body(content: Content) -> some View {
        ZStack(alignment: .leading) {
            if showPlaceHolder {
                Text(placeholder)
                .padding(.horizontal, 15)
            }
            content
            .foregroundColor(Color.white)
            .padding(5.0)            
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

TextField("", text: $data)
.modifier(PlaceholderStyle(showPlaceHolder: data.isEmpty,
                           placeholder: "My Placeholder"))
Run Code Online (Sandbox Code Playgroud)

  • 在 SwiftUI 拥有更改占位符颜色的本机方法之前,这可能会成为新的公认答案 (4认同)

Abh*_*yal 19

在 iOS 15 上,您可以使用prompt

public init(text: Binding<String>, prompt: Text? = nil, @ViewBuilder label: () -> Label)
Run Code Online (Sandbox Code Playgroud)

用作占位符视图


ARG*_*Geo 17

超级简单的解决方案

我们可以用另一个文本的字符串替换 TextField 的占位符。

因此,我们可以控制假“占位符”的颜色。

struct ContentView: View {
    
    @State private var text: String = ""
    
    var body: some View {
        ZStack(alignment: .leading) {
            if text.isEmpty {
                Text("Type Here")
                    .foregroundColor(.red.opacity(0.4))
                    .font(.system(size: 50))
            }
            TextField("", text: $text)
                .font(.system(size: 50))
        }
        .padding(20)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Sat*_*esh 16

这是对@jfk 的回答的一些修改,我们可以创建一个扩展view来简化主视图中的修饰符代码,它也可以用于TextImage

struct PlaceHolder<T: View>: ViewModifier {
    var placeHolder: T
    var show: Bool
    func body(content: Content) -> some View {
        ZStack(alignment: .leading) {
            if show { placeHolder }
            content
        }
    }
}

extension View {
    func placeHolder<T:View>(_ holder: T, show: Bool) -> some View {
        self.modifier(PlaceHolder(placeHolder:holder, show: show))
    }
}
Run Code Online (Sandbox Code Playgroud)

在文本字段中的用法:

将这行代码添加.placeHolder(Text("Your placeholder"), show: text.isEmpty)为 a viewModifierto TextField

TextField("", text: $text, onEditingChanged: { (changing) in
    print("Changing: \(changing)")
}, onCommit: {
    print("Committed!")
})
    .placeHolder(Text("Your placeholder"), show: text.isEmpty)
Run Code Online (Sandbox Code Playgroud)

图像中的用法:

此外,正如@EmilioPelaez建议的那样,我修改了代码以支持任何视图的占位符,例如。Image像下面。

Image("your_image")
    .placeHolder(Image("placeholder_image"), show: true)
Run Code Online (Sandbox Code Playgroud)


Moj*_*ini 9

目前还没有api。但您可以

ZStack自己使用和实现占位符:

var body: some View {
    ZStack(alignment: .leading) {
        if text.isEmpty { Text("Placeholder").foregroundColor(.red) }
        TextField("", text: $text)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以像老板一样使用任何类型的编辑。

-自定义TextField

您始终可以创建自己的自定义,View以在所有地方使用:

struct CustomTextField: View {
    var placeholder: Text
    @Binding var text: String
    var editingChanged: (Bool)->() = { _ in }
    var commit: ()->() = { }

    var body: some View {
        ZStack(alignment: .leading) {
            if text.isEmpty { placeholder }
            TextField("", text: $text, onEditingChanged: editingChanged, onCommit: commit)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法TextField带占位符)

struct ContentView: View {
    @State var text = ""

    var body: some View {
        CustomTextField(
            placeholder: Text("placeholder").foregroundColor(.red),
            text: $text
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个在iOS14上好像不行。TextField 为空,即没有占位符 (3认同)
  • 谢谢你,你拯救了我的一天!如果没有你的技巧,默认颜色对我来说是无法读取的 (2认同)

小智 5

TextField("", text: $text, prompt: Text("Hello").foregroundColor(.white))
Run Code Online (Sandbox Code Playgroud)

更改提示中的文本颜色