在容器视图中共享常见变量

时间:2020-10-24 20:59:38

标签: swiftui

场景:
我有一个很大的观点,我想分解为具有几个子视图的容器视图。
因此,每个视图都有其自己的.string文件。 范例:将流程从一个文件传播到孩子们,作为一个“集体”。

容器视图将充当中心,情报。

我不希望这过于复杂。仅将逻辑模块化在离散零件中,易于维护。

问题:我只能在结构视图之间进行单向操作 @State ---> @Binding ,而无需通过类对象。
有没有办法返回值?例如双向数据交换?
也就是说,子视图是否与父/容器共享其共同的视图?

 View1  |  View2          &   View2     |   View1 <br/>
@State -->@Binding (data) & @Binding <-- @State (result)?

我必须使用某种单例类对象进行数据交换吗?

同样,我是为了简化设计而不是大型单个结构视图。

1 个答案:

答案 0 :(得分:1)

绑定 是将值从子级“返回”到父级的方式。如果孩子没有更新值(即仅单向parent -> child,那么您将不需要绑定-只需在init中传递变量)即可。

struct Child: View {
   @Binding var num: Int
   var body: some View {
      VStack {
         Text("\(num)")
         Button("increase") { self.num += 1 }
      }
   }
}

struct Parent: View {
   @State var sharedNum: Int = 0
   var body: some View {
      VStack {
         Text("\(sharedNum)")
         Child(num: $sharedNum)
         Child(num: $sharedNum)
      }
      .onChange(of: sharedNum) { print("shared num", $0) } // iOS14 required
   }
}

无论哪个孩子更改了它,孩子和父母都会显示相同的数字。


但是,有时孩子可能不需要通过更改值来通知父母。然后您可以使用回调:

struct Child: View {
   var onClick: (Int) -> Void

   var body: some View {
      Button("generate random") { 
         onClick(Int.random(1...100))
      }
   }
}

struct Parent: View {
   var body: some View {
      Child {
         print("new random", $0)
      }
   }
}