You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中@Published属性无法跨视图传递更新的问题求助

问题根源与解决方案

你的问题核心是两个视图使用了完全独立的Parameters实例,导致SpeedView中更新的属性无法同步到PassageView。

具体问题分析

  • SpeedView内部初始化了专属的Parameters()实例
  • PassageView在ContentView中又被传入了全新的Parameters()实例
  • 这两个实例是完全独立的对象,彼此的属性更新不会互相影响

修改步骤

  1. 在父视图统一持有共享实例
    修改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")
                }
            }
        }
    }
    
  2. 修改SpeedView接收共享实例
    去掉SpeedView内部的实例初始化,改为接收父视图传递的对象:

    struct SpeedView: View {
        @ObservedObject var parameters: Parameters
        
        // 其余代码保持不变
    }
    

原理说明

  • @StateObject用于在父视图中创建并持有ObservableObject实例,确保其生命周期与视图绑定
  • @ObservedObject用于在子视图中引用外部传入的ObservableObject实例,自动监听其@Published属性的变化并刷新视图

这样修改后,SpeedView和PassageView共享同一个Parameters实例,当SpeedView中调用runCalc()更新vMoyenne时,PassageView会自动接收到更新并显示最新值。

内容的提问来源于stack exchange,提问作者torfeuzarre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:36:05