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

SwiftUI中NavigationLink(value:)与navigationDestination无法正常工作

核心问题:嵌套的 NavigationStack

DiemDetail 中额外创建了 NavigationStack,这会破坏 HomeView 上层导航栈的上下文结构,直接导致 NavigationLink 无法触发跳转。导航操作需要在同一个 NavigationStack 环境中完成,详情页无需再新建独立导航栈。

修复步骤

  1. 移除详情页的嵌套 NavigationStack
    保留 DiemDetail 的内容和 toolbar,删除外层的 NavigationStack 即可。

    修正后的 DiemDetail 代码:

    struct DiemDetail: View {
        var diem: Diem
    
        var body: some View {
            VStack() {
                // 原有视图代码
            }
            .toolbar {
                // 原有toolbar代码
            }
        }
    }
    
  2. (可选优化)避免重复数据查询
    DiemsGrid 无需重复声明 @Query,可以直接从 HomeView 传入已查询的数组,减少重复数据库请求,提升性能。

    优化后的 DiemsGrid 代码:

    struct DiemsGrid: View {
        let diems: [Diem] // 接收上层传递的数组
    
        var body: some View {
            ScrollView(.vertical) {
                LazyVGrid(columns: layout, spacing: 0) {
                    ForEach(diems) { diem in
                        DiemGridItem(diem: diem)
                    }
                }
            }
        }
    }
    

    对应的 HomeView 修改:

    struct HomeView: View {
        @Query(sort: \Diem.date) 
        private var diems: [Diem]
        
        var body: some View {
            NavigationStack {
                DiemsGrid(diems: diems) // 传递已查询的数组
                    .navigationDestination(for: Diem.ID.self) { diemID in
                        if let diem = diems.first(where: { $0.id == diemID }) {
                            DiemDetail(diem: diem)
                        }
                    }
            }
        }
    }
    

额外排查点

  • 确认 Diem 模型的 id 属性遵循 Hashable 协议(SwiftData 模型默认 UUID 或自定义 ID 一般都满足,可快速检查模型定义)。
  • 确保 NavigationLink 的 value 类型与 navigationDestination 声明的类型完全匹配(当前代码中 Diem.ID.self 匹配,无需调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:05:10