SwiftUI:如何在View2中实现基于值的NavigationStack导航?
你的问题核心是**navigationDestination的放置位置错误**。在NavigationStack的机制中,导航目的地必须对发起导航的视图可见——简单说就是,它得放在所有可能触发该导航的视图的共同父层级里,或者直接绑定到NavigationStack的根内容上,这样整个导航栈才能识别到这个目的地配置。
看你的代码,你把navigationDestination附加在了ContentView的VStack上,而View2是通过独立的NavigationLink跳转进入的,它不在这个VStack的子视图树中。这就导致当View2里的基于值的NavigationLink触发时,导航栈找不到对应的目的地规则,虽然View3被推入了栈,但界面无法正确更新跳转。
修复方案
把navigationDestination直接作为NavigationStack根内容的修饰符,确保整个导航栈范围内的视图都能匹配到这个目的地:
struct Animal: Hashable { var name: String var legs: Int } struct ContentView: View { var body: some View { NavigationStack { VStack { Text("Root") .font(.title.bold()) NavigationLink { View2() } label: { Text("Go to View 2") .padding() } } // 将导航目的地移至此处,确保全局可见 .navigationDestination(for: Animal.self, destination: { animal in View3(animal: animal) }) } } } struct View2: View { let cat = Animal(name: "cat", legs: 4) var body: some View { VStack { Text("View 2") .font(.title.bold()) NavigationLink(value: cat) { Text("Go to View 3") .padding() } } } } struct View3: View { let animal: Animal var body: some View { VStack { Text("View 3") .font(.title.bold()) Text(animal.name) .padding() } } }
关键知识点
- NavigationStack的
navigationDestination是基于视图树的可见性工作的,只有发起导航的视图是该修饰符所在视图的子视图时,才能正确匹配目的地。 - 如果需要在多个子视图中使用同一类型的基于值导航,优先把
navigationDestination放在NavigationStack的最顶层根视图上,这样所有子视图都能复用这个规则。
内容的提问来源于stack exchange,提问作者xen555
相关产品推荐
相关产品推荐

