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
相关产品推荐
相关产品推荐

