SwiftUI如何将CalcProcess的KarvonenVal传递到另一文件的SummaryView
可行实现方案
方案1:复用现有WorkoutManager(适配现有代码结构,推荐)
你已经在SummaryView中使用了WorkoutManager作为环境对象,直接扩展这个类即可完成传值,不需要额外新建全局状态:
- 修改WorkoutManager类,新增可观测的目标心率属性
class WorkoutManager: ObservableObject { // 原有代码保持不变 @Published var targetHeartRate: String = "" // 新增这行存储计算结果 }
- 修改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) } } }
- 修改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跳转),可以直接通过构造参数传值:
- 给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) }
- 在CalcProcess跳转时传入计算结果,示例(sheet跳转):
.sheet(isPresented: $showSummary) { SummaryView(karvonenVal: KarvonenVal) .environmentObject(workoutManager) }
内容的提问来源于stack exchange,提问作者Epicminetime
相关产品推荐
相关产品推荐

