SwiftUI子视图状态未按预期更新问题求助
问题原因
你将Binding<Int>存储在值类型枚举CShareSteps中的做法,会导致导航栈内的枚举实例无法响应Model的更新。当Model.count变化时,ParentView会重新渲染,但导航栈里的枚举元素没有改变,navigationDestination闭包不会重新执行,ChildView无法感知到Model的变化,因此视图不会同步更新。
解决方案:传递Model实例而非Binding
导航枚举应存储数据模型的引用,而非视图层的Binding。这样ChildView可以通过@ObservedObject订阅Model的变化,确保视图能实时响应数据更新。
修改后的完整代码:
final class Model: ObservableObject { @Published var count: Int = 0 } struct ParentView: View { @ObservedObject var model: Model @Binding var navigationStack: [CShareSteps] var body: some View { VStack { Text("Parent Count: \(model.count)") Button("Go to Child View") { // 传递Model实例到导航枚举 navigationStack.append(.test(model)) } } .navigationDestination(for: CShareSteps.self) { step in switch step { case let .test(model): // 传递Model给ChildView ChildView(model: model) default: EmptyView() } } .navigationTitle("Parent View") } } struct ChildView: View { @ObservedObject var model: Model var body: some View { VStack { Text("Child Count: \(model.count)") Button("Increment") { // 直接修改Model的属性 model.count += 1 } } .navigationTitle("Child View") } } // 修改枚举,关联Model而非Binding enum CShareSteps: Steps { case test(Model) }
方案说明
ChildView通过@ObservedObject订阅Model的变化,当model.count更新时,SwiftUI会自动触发ChildView的视图刷新。- 导航枚举存储
Model引用而非临时Binding,确保导航栈中的元素能始终关联到数据模型的最新状态。
额外提醒:避免在导航标识(如枚举)中存储Binding、State等视图层类型,这些类型仅适用于视图内部状态管理,不适合作为导航传递的数据。导航数据优先使用数据模型或简单值类型,让视图通过订阅模型变化来更新界面。
内容的提问来源于stack exchange,提问作者Muhammad Aamir Ali
相关产品推荐
相关产品推荐

