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

iOS15 SwiftUI3 NavigationLink跳转后自动pop异常问题问询

这个问题不是SwiftUI 3的已知Bug,是代码实现逻辑导致的。

原因说明

你当前的实现中,所有NavigationLink都嵌套在List的元素循环内部,且使用了和列表元素绑定的tag+selection的触发方式。当viewModel.list数据更新时,整个List会重新渲染,旧的列表Cell连同内部的NavigationLink实例会被全部销毁重建。此时你之前选中的selection值(点击跳转时选的是1~8中的某个数值)不在新的列表数据[9,10,11]范围内,系统无法匹配到对应的tag,就会自动将selection置为nil,触发导航栈自动pop回上一级。

解决方案

方案1:适配iOS15的修复方式

将NavigationLink移出列表循环,仅声明1个全局的隐藏实例绑定跳转状态,不要每个Cell都生成独立的NavigationLink,避免列表刷新影响导航状态:

struct ContentView: View {
    @EnvironmentObject var viewModel: ViewModel
    @State private var selectedElement: Int?
    @State private var pushActive = false

    var body: some View {
        NavigationView {
            List(viewModel.list, id: \.self) { element in
                Button {
                    selectedElement = element
                    pushActive = true
                } label: {
                    Text(element, format: .number)
                }
            }
            // 全局隐藏的NavigationLink,不受列表刷新影响
            .background(
                NavigationLink(isActive: $pushActive) {
                    TestView()
                    // 如果需要传递选中的参数,直接使用selectedElement即可
                } label: {
                    EmptyView()
                }
            )
            .onAppear {
                viewModel.changeAfterTime()
            }
        }
    }
}

方案2:适配iOS16+的更优写法

直接替换已废弃的NavigationView为NavigationStack,搭配navigationDestination管理路由,导航状态和列表数据源完全解耦,不会出现自动pop问题:

struct ContentView: View {
    @EnvironmentObject var viewModel: ViewModel
    @State private var navPath = NavigationPath()

    var body: some View {
        NavigationStack(path: $navPath) {
            List(viewModel.list, id: \.self) { element in
                Button {
                    navPath.append(element)
                } label: {
                    Text(element, format: .number)
                }
            }
            .navigationDestination(for: Int.self) { element in
                TestView()
                // 可直接使用传递过来的element参数
            }
            .onAppear {
                viewModel.changeAfterTime()
            }
        }
    }
}

问题复现效果

问题复现动图

内容的提问来源于stack exchange,提问作者PiterPan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:02