SwiftUI NavigationStack问题:点击后未跳转至目标视图却重复显示原视图
你遇到的问题是因为**navigationDestination修饰符的作用范围错误**:在FirstDestination中,你把navigationDestination直接附加在NavigationLink视图上,而不是将其注册到NavigationStack的子视图层级中。
NavigationStack的基于值的导航系统要求,navigationDestination必须被添加到NavigationStack能感知到的视图范围内(也就是NavigationStack的子视图树里),这样系统才能将NavigationLink传递的value和对应的目标视图关联起来。如果把navigationDestination绑在单个NavigationLink上,NavigationStack无法识别这个目的地注册,点击链接时找不到对应的跳转目标,就会出现重复显示当前页面的异常。
把navigationDestination从NavigationLink后面移出来,添加到FirstDestination的根视图上,让它处于NavigationStack的视图层级范围内:
struct FirstDestination: View { var body: some View { VStack { NavigationLink("Second Destination", value: "my name") } .navigationDestination(for: String.self) { name in SecondDestination(name: name) } } }
或者你也可以把navigationDestination直接注册到最外层的NavigationStack中,这样所有子视图传递的String类型value都会匹配到同一个目标视图:
struct ContentView: View { var body: some View { NavigationStack { NavigationLink { FirstDestination() } label: { Text("First Destination") } .navigationDestination(for: String.self) { name in SecondDestination(name: name) } } } } struct FirstDestination: View { var body: some View { NavigationLink("Second Destination", value: "my name") } }
这两种写法都能让NavigationStack正确识别跳转目标,点击「Second Destination」后就能正常显示SecondDestination视图。
内容的提问来源于stack exchange,提问作者Isaak

