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

SwiftUI Navigation Stack:如何将导航标题传递至目标视图

解决SwiftUI NavigationStack传递导航标题的方案(不修改原模型)

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:30:38