You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:解决NavigationStack嵌套导航重复跳转及层级导航问题

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:35:16