SwiftUI NavigationStack枚举路由切换时如何传递自定义值?
要实现通过枚举路由传递自定义值,核心是给枚举添加关联值,让每个路由case能携带需要传递的数据,然后在navigationDestination的回调里取出这些值,传给对应的目标视图。
修改后的完整代码
import SwiftUI // 给枚举添加关联值,用于携带要传递的数据 enum RouteNew { case linkOne(String) case linkTwo(String) } struct Nav: View { @State private var pathNew = NavigationPath() var body: some View { NavigationStack(path: $pathNew) { // 点击时传递带关联值的路由 NavigationLink("Link One", value: RouteNew.linkOne("来自Link One的自定义内容")) NavigationLink("Link Two", value: RouteNew.linkTwo("来自Link Two的自定义内容")) .navigationDestination(for: RouteNew.self) { route in switch route { case .linkOne(let customValue): // 将关联值传给ViewOne ViewOne(path: $pathNew, valueToImport: customValue) case .linkTwo(let customValue): // 将关联值传给ViewTwo ViewTwo(path: $pathNew, valueToImport: customValue) } } } } } // Swift规范:视图类型名首字母大写 struct ViewOne: View { @Binding var path: NavigationPath var valueToImport: String var body: some View { Text("View One value: \(valueToImport)") } } struct ViewTwo: View { @Binding var path: NavigationPath var valueToImport: String var body: some View { Text("View Two value: \(valueToImport)") } } struct ViewThree: View { @Binding var path: NavigationPath var valueToImport: String var body: some View { Text("View Three value: \(valueToImport)") } }
关键步骤说明
- 修改枚举结构:给
RouteNew的每个case添加关联值类型(这里用String,你可以替换成Int、自定义模型等任意类型),让路由本身承载传递的数据。 - 更新NavigationLink:创建
NavigationLink时,传入带关联值的枚举实例,把要传递的自定义值嵌入进去。 - 解析关联值并传递:在
navigationDestination的switch分支中,通过let customValue取出枚举的关联值,再把这个值传给目标视图的valueToImport参数。
另外补充:Swift命名规范要求视图类型名首字母大写,所以我把原代码中的viewOne这类名称改成了ViewOne,这是更规范的写法。
内容的提问来源于stack exchange,提问作者Pro Girl
相关产品推荐
相关产品推荐

