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

SwiftUI中NavigationLink跳转View3后立即返回View2问题排查

问题原因及解决方法

问题根源

问题出在View2中categories的定义方式以及DataManager状态更新触发的视图刷新:

  1. 你在View2结构体内部定义了let categories = [Category(...)],每次View2的body被重新计算时(比如DataManager的articles数组更新时),这个数组会被重新创建,每个Category实例都会生成新的UUID作为id。
  2. SwiftUI的List依赖Identifiable的id跟踪列表项状态,当id突然变化时,List会认为原列表项被替换,导致对应的NavigationLink导航状态被重置,刚推入的View3会被直接弹出。

手动写三个单独NavigationLink时,每个链接的目标固定,不会因视图刷新改变标识,所以功能正常。

解决方法

方法一:将categories设为静态常量

确保categories只初始化一次,保持Category的id稳定:

struct View2: View{
    // 改为static let,仅初始化一次
    static let categories = [
        Category(name: "Category 1"),
        Category(name: "Category 2"),
        Category(name: "Category 3")
    ]
    
    var body: some View {
        List(Self.categories){ category in
            NavigationLink(destination: View3(category: category), label: { Text(category.name) })
        }
        .navigationBarTitle("View 2")
        .navigationBarTitleDisplayMode(.inline)
    }
}

方法二:调整Category的id生成逻辑

如果name不会重复,可直接用name作为id,即使重新创建实例,id也不会变化:

struct Category: Identifiable {
    var id: String { name } // 用name作为唯一标识
    var name : String
}

两种方法都能解决导航后立即返回的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:55:26