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

