You need to enable JavaScript to run this app. SwiftUI 如何在不同视图中使用其他视图的计算属性值
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI 如何在不同视图中使用其他视图的计算属性值

高尔夫计分App跨视图数据传递问题求助

我是SwiftUI开发新手,目前正在开发第二款应用,其复杂度远高于第一款。最近我遇到了一个卡了好几天的需求问题,查阅了大量关于@State、@Binding、ObservableObject的视频和文章,始终找不到解决方案,绕了很多圈子。

我正在开发一款高尔夫计分App:用户会逐洞输入得分,系统会在当前视图中完成各类计算并展示结果,其中一项是当前洞的总得分。当用户进入第二洞时,除了要完成和第一洞相同的得分计算展示流程,还需要额外将第一洞和第二洞的总得分相加得到两洞累计得分。我尝试了多种实现方式,要么得到的累计值始终为0,要么就是报出大量难以排查的错误,因此没办法把所有错误都列出来。

恳请大家提供帮助,我附上了精简后的代码(附带需求说明),如果可以直接基于我的代码修改出可运行的版本就最好了,这样我可以直观地理解整个实现逻辑。提前感谢大家的帮助!


启动页

这个页面仅用于启动一轮游戏,点击后会跳转到第一洞页面,后续第一洞页面的导航链接会跳转到第二洞,以此类推。

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: Hole1View()) {
                Text("Start Round")
                    .frame(width: 300, height: 30)
                    .font(.system(size: 18, weight: .bold, design: .rounded))
                    .lineLimit(1)
                    .multilineTextAlignment(.center)
                    .padding(18)
                    .background(Color.yellow)
                    .foregroundColor(Color.blue)
                    .cornerRadius(10)
                    .border(Color.blue, width: 10)
                    .cornerRadius(1)
            }
        }
    }
}

struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

第一洞页面

这个页面需要用户输入各类信息,并完成多项计算在页面中展示。其中一项计算会得到hole1totalpoints值,这个值需要在后续页面的计算中使用。

import SwiftUI

struct Hole1View: View {
    @State private var hole1gross = 0
    
    var hole1totalpoints: Int {
        let hole1points = hole1gross * 3
        return hole1points
    }
    
    var body: some View {
        Stepper("\(hole1gross)", value: $hole1gross, in: 0...15)
            .frame(width: 300, height: 35, alignment: .leading)
            .font(.system(size: 16, weight: .bold, design: .rounded))
            .minimumScaleFactor(0.6)
            .multilineTextAlignment(.leading)
            .lineLimit(2)
        
        Text("Calculated Value \(hole1totalpoints)")
        
        NavigationLink(destination: Hole2View()) {
            Text("Go to hole 2")
        }
    }
}

struct Hole1View_Previews: PreviewProvider {
    static var previews: some View {
        Hole1View()
    }
}

第二洞页面

这个页面需要用户输入各类信息,并完成多项计算在页面中展示。其中一项计算是得到hole2totalpoints值,另有一项计算需要用到上一洞(Hole1View)的hole1totalpoints值,来计算两个洞的总得分(hole1totalpoints + hole2totalpoints)并在当前页面展示。

import SwiftUI

struct Hole2View: View {
    @State private var hole2gross = 0
    @State private var hole2totpoints = 0
    
    var hole2totalpoints: Int {
        let hole2points = hole2gross * 2
        return hole2points
    }
    
    var body: some View {
        Stepper("\(hole2gross)", value: $hole2gross, in: 0...15)
            .frame(width: 300, height: 35, alignment: .leading)
            .font(.system(size: 16, weight: .bold, design: .rounded))
            .minimumScaleFactor(0.6)
            .multilineTextAlignment(.leading)
            .lineLimit(2)
        
        Text("Calculated Value \(hole2totalpoints)")
    }
}

struct Hole2View_Previews: PreviewProvider {
    static var previews: some View {
        Hole2View()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 05:15:07