在容器视图中共享公共变量

弗雷德里克·李

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

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

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

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

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

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

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

新开发者

绑定将值从子级“返回”到父级的方式。如果孩子没有更新值(即,仅一种方式)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)
      }
   }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章