我定义了一个自定义视图修饰符,它仅影响特定类型的视图。但我在一个容器中有 4 个该特定类型的视图。现在,我只能将视图修改器应用于视图 4 次。如何仅将视图修饰符应用于容器 1 次,并让容器中的视图自动获取视图修饰符。
编辑: 我的代码是这样的:
VStack{
otherTypeSubView
HStack{
subview1
.customViewModifierFunc
subview2
.customViewModifierFunc
otherTypeSubView
}
subview3
.customViewModifierFunc
subview4
.customViewModifierFunc
}
我想通过使用获得相同的效果:
VStack{
otherTypeSubView
HStack{
subview1
subview2
otherTypeSubView
}
subview3
subview4
}
.customViewModifierFunc
您可以使用
Group
示例:
Group {
Text("Hello,")
Text("World")
}.font(.title)
这个问题已经有两年了,但还没有公认的答案。
我定义了一个自定义视图修饰符,它仅影响特定类型的视图。
我假设某种类型的视图是您创建的,现在您想要执行间接配置,其中修改器适用于该类型的所有子级。在这种情况下,我会使用一个环境。以下示例演示如何创建一个修改器,将相同的整数应用于
MyCustomView
类型的所有子视图,除非其中一个已覆盖它,即 VStack
中的最后一个。
struct MyCustomView: View {
@Environment(\.myCustomViewAge)
private var age: Int
var body: some View {
VStack {
HStack {
Image(systemName: "globe")
Text("You are \(age)")
}
Divider()
}
}
}
extension View {
func myCustomViewAge(_ age: Int) -> some View {
environment(\.myCustomViewAge, age)
}
}
extension EnvironmentValues {
@Entry var myCustomViewAge: Int = 0
}
#Preview {
VStack {
Text("One")
MyCustomView()
Text("Two")
MyCustomView()
Text("Next one doesn't inherit the env. value")
MyCustomView()
.myCustomViewAge(1)
}
.myCustomViewAge(20)
}
使用 Xcode v16 (16A242) 进行测试。项目部署版本:iOS 16