如何定义可以应用于容器但仅影响容器中某种类型的子视图的视图修饰符

问题描述 投票:0回答:2

我定义了一个自定义视图修饰符,它仅影响特定类型的视图。但我在一个容器中有 4 个该特定类型的视图。现在,我只能将视图修改器应用于视图 4 次。如何仅将视图修饰符应用于容器 1 次,并让容器中的视图自动获取视图修饰符。

编辑: 我的代码是这样的:

VStack{
    otherTypeSubView
    HStack{
        subview1
           .customViewModifierFunc
        subview2
           .customViewModifierFunc
        otherTypeSubView
    }
    subview3
       .customViewModifierFunc
    subview4
       .customViewModifierFunc
}

我想通过使用获得相同的效果:

VStack{
        otherTypeSubView
        HStack{
            subview1
            subview2
            otherTypeSubView
        }
        subview3
        subview4
}
 .customViewModifierFunc
swiftui
2个回答
0
投票

您可以使用

Group

示例:

Group {
    Text("Hello,")
    Text("World")
}.font(.title)

0
投票

这个问题已经有两年了,但还没有公认的答案。

我定义了一个自定义视图修饰符,它仅影响特定类型的视图。

我假设某种类型的视图是您创建的,现在您想要执行间接配置,其中修改器适用于该类型的所有子级。在这种情况下,我会使用一个环境。以下示例演示如何创建一个修改器,将相同的整数应用于

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

© www.soinside.com 2019 - 2024. All rights reserved.