SwiftUI如何在视图间传递数据?iPad端点击左侧列表右侧视图不更新如何解决
问题解决方法
核心问题根源
- 点击按钮时新建的
FeatureView2实例,和右侧已经渲染的FeatureView2不是同一个对象,修改新建实例没有任何作用 title变量定义在FeatureView2的body内部,每次视图刷新时该变量都会被重置,无法持久保存状态- 没有使用SwiftUI状态管理机制建立两个视图之间的数据关联
修正方案
第一步:修改FeatureView2,使用@Binding接收外部状态
struct FeatureView2: View { // 绑定父视图传入的状态 @Binding var title: String var body: some View { ZStack { Text(title) } } }
第二步:修改FeatureView1,持有共享状态并绑定到子视图
struct FeatureView1 : View { // 用@State持有需要共享的可变状态 @State private var feature2Title = "初始标题" var body: some View { HStack { List(item) { items in Button("Click to update title in Feature View 2") { // 仅修改状态值即可,SwiftUI会自动更新关联视图 feature2Title = "Button Called" } } // 把状态绑定到右侧的FeatureView2 FeatureView2(title: $feature2Title) } } }
注意事项
- 所有需要驱动视图更新的可变状态,必须使用SwiftUI提供的
@State、@Binding、@ObservedObject等包装器修饰 - 不要在
body方法内部定义存储属性,body是计算属性,每次刷新都会重新执行内部代码,定义的变量不会持久保存 - 同层级视图间的数据传递,由共同的父视图持有状态,子视图通过
@Binding关联该状态即可实现联动更新
内容的提问来源于stack exchange,提问作者Travgalax
相关产品推荐
相关产品推荐

