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

SwiftUI视图间传值问题:如何将计算结果传递至ResultView

解决SwiftUI视图间数值传递问题

问题核心

当前代码用String作为导航路径标识,无法携带计算结果数据,导致ResultView无法访问EnterNumberView中的calculation值。

解决方案

通过自定义导航目标枚举实现带数据的视图跳转,具体步骤如下:

1. 定义导航目标枚举

创建枚举明确所有导航场景,其中result关联计算结果字符串:

enum NavTarget {
    case enterNumber
    case result(String)
}

2. 更新ContentView适配新导航逻辑

修改path的使用方式,在navigationDestination中处理带数据的视图跳转:

struct ContentView: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            Button {
                path.append(NavTarget.enterNumber)
            } label: {
                Text("Multiply")
            }
            .navigationDestination(for: NavTarget.self) { target in
                switch target {
                case .enterNumber:
                    EnterNumberView(path: $path)
                case .result(let calculation):
                    ResultView(result: calculation)
                }
            }
        }
    }
}

3. 修改EnterNumberView的跳转逻辑

跳转时将计算好的calculation值通过枚举传递:

struct EnterNumberView: View {
    @Binding var path: NavigationPath
    @State var input1: String = ""
    @State var input2: String = ""

    var calculation: String {
        guard !input1.isEmpty, !input2.isEmpty else { return "" }
        guard let m = Double(input1), let n = Double(input2) else { return "Error" }
        let product = m * n
        return String(format: "%.2f", product)
    }

    var body: some View {
        VStack {
            TextField("Enter First Number", text: $input1)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            TextField("Enter Second Number", text: $input2)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            
            Button {
                path.append(NavTarget.result(calculation))
            } label: {
                Text("Tap to see result")
            }
        }
        .padding()
    }
}

4. 更新ResultView接收并展示结果

给ResultView添加接收结果的属性,同时处理空值/错误情况:

struct ResultView: View {
    let result: String
    
    var body: some View {
        Text("Your result is \(result.isEmpty ? "Please enter valid numbers" : result)")
            .padding()
    }
}

关键说明

  • 关联枚举作为导航目标,既能明确视图跳转逻辑,又能安全携带数据,避免字符串标识的歧义。
  • 在ResultView中添加空值处理,提升用户输入不合法时的体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:10:31