我正在创建一个自定义的TextField
视图,它由多个装饰视图组成。我希望能够设置内部的TextField
视图修饰符,例如键盘、大写等,这些只适用于子视图。
我认为最好的做法不是为每个视图属性创建属性,而是传入一个可选的ViewModifier
参数,并像这样使用它:
struct MySuperTextField: View {
var vm: ViewModifier?
var body: some View {
TextField(...)
.modifier( vm ?? EmptyModifier() )
// ... more views here
}
}
由于ViewModifier
中的associatedType
,所以这个不起作用。遗憾的是,也没有像AnyViewModifier这样的东西(我也想不出如何制作一个可行的)。
有人成功做到类似的事情吗?我在搜索网络时找不到任何相关信息。
以下是示例:
struct LastNameModifier: ViewModifier {
func body(content: Content) -> some View {
content
.autocapitalization(.words)
.textContentType(.familyName)
.backgroundColor(.green)
// ... anything else specific to names
}
}
struct EmailModifier: ViewModifier {
func body(content: Content) -> some View {
content
.keyboardType(.emailAddress)
.textContentType(.emailAddress)
.backgroundColor(.yellow)
// ... anything else specific to emails
}
}
然后像这样与我的 MySuperTextField
一起使用:
VStack {
MySuperTextField("Last Name", $lastName, vm: LastNameModifier())
MySuperTextField("Email", $email, vm: EmailModifier())
}