iOS16中NavigationStack用navigationDestination跳转不同视图异常解决
问题原因
你推测的完全正确——问题出在两个navigationDestination都绑定了String.self类型。SwiftUI中,同一类型的navigationDestination会被后续添加的覆盖,最终只有最后一个生效,所以无论点击哪个NavigationLink,都会跳转到Link2视图。
解决方法
方法一:用自定义枚举区分跳转类型(推荐)
通过定义一个符合Hashable协议的枚举,把不同跳转目标封装成枚举case,让每个NavigationLink的value对应不同枚举值,这样就能精准匹配跳转视图。
import SwiftUI // 定义枚举区分不同跳转场景 enum NavTarget: Hashable { case link1 case link2 } struct NavTest: View { var body: some View { NavigationStack { NavigationLink("Link1", value: NavTarget.link1) NavigationLink("Link2", value: NavTarget.link2) .navigationDestination(for: NavTarget.self) { target in switch target { case .link1: Link1() case .link2: Link2() } } } } } struct NavTest_Previews: PreviewProvider { static var previews: some View { NavTest() } } struct Link1: View { var body: some View{ Text("You are in Link1 view") } } struct Link2: View { var body: some View{ Text("You are in Link2 view") } }
这种方式扩展性强,后续新增跳转目标只需在枚举里加case,代码更易维护。
方法二:在同一String类型的navigationDestination中判断值
如果不想新增枚举,也可以保留String类型的value,只写一个navigationDestination,根据传入的字符串值判断跳转视图:
import SwiftUI struct NavTest: View { var body: some View { NavigationStack { NavigationLink("Link1", value: "Link-1") NavigationLink("Link2", value: "Link-2") .navigationDestination(for: String.self) { txtValue in if txtValue == "Link-1" { Link1() } else if txtValue == "Link-2" { Link2() } } } } } // 其余视图代码不变
这种方式适合简单场景,但如果跳转字符串增多,代码会变得臃肿且容易出错。
内容的提问来源于stack exchange,提问作者Pro Girl
相关产品推荐
相关产品推荐

