swift - 传递传递的绑定 (@Binding)
问题描述
如果我将绑定传递给另一个视图,那么第二个视图是否可以传递绑定并让第三个视图更改第一个视图中的值,或者这会导致意外行为吗?
例如,如果我有
struct FirstView: View {
@State var input: String = ""
var body: some View {
Form {
CustomTextField("Placeholder", $input)
}
}
}
struct CustomTextField: View {
@Binding var text: String
var body: some View {
ThirdView(text: $text)
}
}
struct ThirdView: View {
@Binding var text: String
var body: some View {
TextField("Result", $text)
}
}
我知道上面的内容是荒谬的——我只是将它用于演示目的——但是会ThirdView
正确更新第一个状态吗?
我有一些例子可以正常工作,而其他一些例子却不能,但真的找不到太多解释。
解决方案
如果我将绑定传递给另一个视图,那么第二个视图是否可以传递绑定并让第三个视图更改第一个视图中的值,或者这会导致意外行为吗?
根据我的观察,有以下变体:
1)如果这些视图存在于一个视图层次结构中(或另一个视图层次结构中),那么这种组合工作
2) 如果这些视图位于不同的视图层次结构中(或视图被替换,例如通过导航),则绑定仅在一个级别上起作用,但更深层次的传输具有意想不到的行为(最常见的缺陷是中间视图没有更新)。
有问题的代码有效(使用 Xcode 11.4 / iOS 13.4 测试),因为适合变体 1。