SwiftUI Navigation Stack:如何将导航标题传递至目标视图
方案1:创建临时包装类型传递组合数据
既然不能修改Foo模型,我们可以定义一个轻量的哈希兼容的包装结构体,把需要的导航标题和目标视图的数据源打包在一起,这样就能在navigationDestination中同时拿到标题和数据。
具体代码修改如下:
// 定义包装类型,仅用于导航传递数据 struct BarNavData: Hashable { let title: String let items: [String] } struct MyNavigationStackView: View { @State private var data = exampleData var body: some View { NavigationStack { List(data) { d in // 传递包装后的标题+数据组合 NavigationLink(value: BarNavData(title: d.name, items: d.bar)) { Text(d.name) } } // 对应包装类型的导航目标处理 .navigationDestination(for: BarNavData.self) { navData in List(navData.items, id: \.self) { e in Text(e) } .navigationTitle(navData.title) // 直接设置导航标题 } // 保留原有的Foo类型导航目标 .navigationDestination(for: Foo.self) { elements in // 原有的其他视图逻辑 } } } }
方案2:利用状态变量记录选中项标题(适合简单场景)
如果不想新增结构体,也可以通过状态变量记录当前选中项的标题,配合NavigationLink的selection绑定实现:
struct MyNavigationStackView: View { @State private var data = exampleData @State private var selectedBar: [String]? @State private var currentNavTitle = "" var body: some View { NavigationStack { List(data) { d in NavigationLink( tag: d.bar, selection: $selectedBar, label: { Text(d.name) } ) // 点击时记录当前项的标题 .onTapGesture { currentNavTitle = d.name } } .navigationDestination(for: [String].self) { elements in List(elements, id: \.self) { e in Text(e) } .navigationTitle(currentNavTitle) } .navigationDestination(for: Foo.self) { elements in // 原有的其他视图逻辑 } } } }
不过这个方案依赖onTapGesture,如果视图有其他交互逻辑可能会冲突,相比之下方案1的包装类型更可靠,也更符合SwiftUI的导航设计思路。
内容的提问来源于stack exchange,提问作者AppsRD
相关产品推荐
相关产品推荐

