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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:05:27