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

SwiftUI如何将CalcProcess的KarvonenVal传递到另一文件的SummaryView

可行实现方案

方案1:复用现有WorkoutManager(适配现有代码结构,推荐)

你已经在SummaryView中使用了WorkoutManager作为环境对象,直接扩展这个类即可完成传值,不需要额外新建全局状态:

  1. 修改WorkoutManager类,新增可观测的目标心率属性
class WorkoutManager: ObservableObject {
    // 原有代码保持不变
    @Published var targetHeartRate: String = "" // 新增这行存储计算结果
}
  1. 修改CalcProcess视图,计算完成后同步值到WorkoutManager
struct CalcProcess: View{
    @Binding var NumAdded3:Bool
    @State var Age:Int
    @State var ExerciseIT:Int
    @State var ConstantNumber = 220
    @State var RHR:Int
    @EnvironmentObject var workoutManager: WorkoutManager // 新增环境对象声明
    
    func karvonen(cn: Int, rhr: Int, age: Int, ei:Double) -> Double {
        return Double((cn-age-rhr)) * (ei / 10) + Double(rhr)
    }
    
    var body: some View {
        let output = karvonen(cn: ConstantNumber, rhr: RHR, age: Age, ei: Double(ExerciseIT))
        let roundedDouble = Double(round(1000*output)/1000)
        let KarvonenVal: String = String(format: "%.1f", roundedDouble)
        // 新增:计算完成后自动同步到全局管理器
        DispatchQueue.main.async {
            workoutManager.targetHeartRate = KarvonenVal
        }
           
        VStack{
            Text("\(KarvonenVal)")
                .foregroundStyle(.red)
        }
    }
}
  1. 修改SummaryView直接读取数值
// 把原有Target Heart Rate对应的行替换为下面的代码
SummaryMetricView(title: "Target Heart Rate",
                  value: workoutManager.targetHeartRate + " bpm")
    .foregroundStyle(.red)

注意:如果之前EnvironmentObject方案失效,通常是两个原因:① 整个视图树的根节点没有注入WorkoutManager实例(需要在入口视图添加.environmentObject(WorkoutManager())修饰符);② 要共享的属性没有加@Published修饰符,无法触发视图刷新。


方案2:直接参数传值(适合两个视图有直接跳转关系的场景)

如果CalcProcess和SummaryView是直接跳转(比如sheet、NavigationLink跳转),可以直接通过构造参数传值:

  1. 给SummaryView新增接收参数
struct SummaryView: View {
    @EnvironmentObject var workoutManager: WorkoutManager
    @Environment(\.dismiss) var dismiss
    let karvonenVal: String // 新增接收参数
    // 其余原有代码不变
    SummaryMetricView(title: "Target Heart Rate",
                      value: karvonenVal + " bpm")
        .foregroundStyle(.red)
}
  1. 在CalcProcess跳转时传入计算结果,示例(sheet跳转):
.sheet(isPresented: $showSummary) {
    SummaryView(karvonenVal: KarvonenVal)
        .environmentObject(workoutManager)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:21:00