场景:
我有一个很大的观点,我想分解为具有几个子视图的容器视图。
因此,每个视图都有其自己的.string文件。
范例:将流程从一个文件传播到孩子们,作为一个“集体”。
容器视图将充当中心,情报。
我不希望这过于复杂。仅将逻辑模块化在离散零件中,易于维护。
问题:我只能在结构视图之间进行单向操作 @State ---> @Binding ,而无需通过类对象。
有没有办法返回值?例如双向数据交换?
也就是说,子视图是否与父/容器共享其共同的视图?
View1 | View2 & View2 | View1 <br/>
@State -->@Binding (data) & @Binding <-- @State (result)?
我必须使用某种单例类对象进行数据交换吗?
同样,我是为了简化设计而不是大型单个结构视图。
答案 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)
}
}
}