SwiftUI:解决NavigationStack嵌套导航重复跳转及层级导航问题
问题根源在于多次为String类型声明navigationDestination,NavigationStack只会使用最靠近根视图的那个声明,导致厨房页面的导航链接始终触发根视图的跳转逻辑,重复进入厨房。
解决方法是用枚举定义明确的导航目标,并将所有导航目标的处理统一放在根视图的NavigationStack中:
1. 创建导航目标枚举
首先定义一个实现Hashable的枚举,每个case对应一个页面,避免类型冲突:
enum NavigationTarget: Hashable { case kitchen case lounge case anotherLounge }
2. 重构根视图导航配置
在HomePage中统一处理所有导航目标,移除子页面中的navigationDestination声明:
struct HomePage: View { @State private var path = NavigationPath() var body: some View { NavigationStack(path: $path) { Text("My home") // 使用枚举case作为导航值 NavigationLink("Enter home", value: NavigationTarget.kitchen) // 统一处理所有导航目标的跳转逻辑 .navigationDestination(for: NavigationTarget.self) { target in switch target { case .kitchen: KitchenPage(path: $path) case .lounge: LoungePage(path: $path) case .anotherLounge: Text("Another Lounge") // 可替换为你需要的后续页面 } } } .padding() } }
3. 更新子页面的导航链接
修改KitchenPage和LoungePage中的NavigationLink,使用对应的枚举case作为值,同时移除子页面内的navigationDestination:
KitchenPage 修改后
struct KitchenPage: View { @Binding var path: NavigationPath var body: some View { VStack{ Text("This is the kitchen") NavigationLink("Go Deeper", value: NavigationTarget.lounge) Button("Back by one") { path.removeLast() } Button("Back to root") { path = NavigationPath() } } } }
LoungePage 修改后
struct LoungePage: View { @Binding var path: NavigationPath var body: some View { VStack{ Text("This is the lounge") NavigationLink("Go Deeper", value: NavigationTarget.anotherLounge) Button("Back by one") { path.removeLast() } Button("Back to root") { path = NavigationPath() } } } }
效果说明
- 消除了Xcode的重复导航目标警告
- 实现了首页→厨房→客厅的层级导航,点击对应链接可正常跳转
- 保留了逐级返回和直接返回根视图的功能,逻辑完全正常
内容的提问来源于stack exchange,提问作者LePrinceDeDhump
相关产品推荐
相关产品推荐

