SwiftUI中NavigationLink跳转View3后立即返回View2问题排查
问题原因及解决方法
问题根源
问题出在View2中categories的定义方式以及DataManager状态更新触发的视图刷新:
- 你在
View2结构体内部定义了let categories = [Category(...)],每次View2的body被重新计算时(比如DataManager的articles数组更新时),这个数组会被重新创建,每个Category实例都会生成新的UUID作为id。 - 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
相关产品推荐
相关产品推荐

