我想进入swift/swiftui,但我真的很难做到这一点:
我有一个包含ChildView
的MainView
。ChildView
有一个函数update
,用于从外部源获取要显示的数据,并将其赋给@State data
变量。
我希望能够从MainView
触发update
,以便更新data
。
我曾经体验过update
实际上被调用,但是,data
在此调用时被重置为初始值。
我所拥有的总结:
struct ChildView: View {
@State var data: Int = 0
var body: some View {
Text("\(data)")
Button(action: update) {
Text("update") // works as expected
}
}
func update() {
// fetch data from external source
data = 42
}
}
struct MainView: View {
var child = ChildView()
var body: some View {
VStack {
child
Button(action: {
child.update()
}) {
Text("update") // In fact calls the function, but doesn't set the data variable to the new value
}
}
}
}
当我在谷歌上搜索解决方案时,我只遇到一些人建议将update
和data
移动到MainView
,然后将data
的绑定传递到ChildView
。
然而,按照这个逻辑,我必须通过添加所有的数据访问逻辑来破坏MainView
。我使用ChildView
的目的是将代码分解成更小的块,并重用ChildView
,包括其他父视图中的数据访问方法。我只是不能相信在SwiftUI中没有办法做到这一点。
1条答案
按热度按时间deyfvvtc1#
一开始对如何处理SwiftUI上的状态感到困惑是完全可以理解的,但是坚持住,你很快就会找到你的方向。
根据项目的要求和限制,您可以通过许多不同的方式来实现您想要做的事情。我将提到一些选项,但我肯定还有更多选项,所有选项都有优缺点,但希望其中一个能满足您的需要。
绑定
也许最简单的方法是使用
@Binding
,here是一个很好的教程/解释。例如,在
MainView
上声明data
,并将其作为@Binding
传递给ChildView
。当需要更改data
时,直接在MainView
上更改它,并将反映在两者上。这种解决方案导致在两个部分都有逻辑,可能不是很理想,但可以满足您的需要。
还要注意
ChildView
的initialiser
现在是如何直接位于MainView
的主体上的。示例
可观察对象
另一种选择是从视图中删除状态和逻辑,使用
ObservableObject
,here作为它的解释。示例
一个一个二个一个一个一个三个一个一个一个一个一个四个一个