SwiftUI中@Published属性无法跨视图传递更新的问题求助
问题根源与解决方案
你的问题核心是两个视图使用了完全独立的Parameters实例,导致SpeedView中更新的属性无法同步到PassageView。
具体问题分析
SpeedView内部初始化了专属的Parameters()实例PassageView在ContentView中又被传入了全新的Parameters()实例- 这两个实例是完全独立的对象,彼此的属性更新不会互相影响
修改步骤
在父视图统一持有共享实例
修改ContentView.swift,用@StateObject创建唯一的Parameters实例,传递给两个子视图:struct ContentView: View { @StateObject private var parameters = Parameters() var body: some View { TabView { SpeedView(parameters: parameters).tabItem { Label("Vitesse", systemImage: "figure.run.circle.fill") } PassageView(parameters: parameters).tabItem { Label("Passage", systemImage: "timer.circle.fill") } } } }修改
SpeedView接收共享实例
去掉SpeedView内部的实例初始化,改为接收父视图传递的对象:struct SpeedView: View { @ObservedObject var parameters: Parameters // 其余代码保持不变 }
原理说明
@StateObject用于在父视图中创建并持有ObservableObject实例,确保其生命周期与视图绑定@ObservedObject用于在子视图中引用外部传入的ObservableObject实例,自动监听其@Published属性的变化并刷新视图
这样修改后,SpeedView和PassageView共享同一个Parameters实例,当SpeedView中调用runCalc()更新vMoyenne时,PassageView会自动接收到更新并显示最新值。
内容的提问来源于stack exchange,提问作者torfeuzarre
相关产品推荐
相关产品推荐

