SwiftUI中NavigationLink(value:)与navigationDestination无法正常工作
核心问题:嵌套的 NavigationStack
DiemDetail 中额外创建了 NavigationStack,这会破坏 HomeView 上层导航栈的上下文结构,直接导致 NavigationLink 无法触发跳转。导航操作需要在同一个 NavigationStack 环境中完成,详情页无需再新建独立导航栈。
修复步骤
移除详情页的嵌套 NavigationStack
保留 DiemDetail 的内容和 toolbar,删除外层的 NavigationStack 即可。修正后的 DiemDetail 代码:
struct DiemDetail: View { var diem: Diem var body: some View { VStack() { // 原有视图代码 } .toolbar { // 原有toolbar代码 } } }(可选优化)避免重复数据查询
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
相关产品推荐
相关产品推荐

