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

SwiftUI:watchOS 8.1RC下TabView中NavigationLink跳转后立即退回问题求助

问题根因

这是watchOS 8.1版本正式引入的SwiftUI已知回归缺陷,触发条件为「外层已存在NavigationView的场景下,TabView子项内部嵌套了第二层NavigationView」,系统会错误识别导航栈层级,触发自动pop逻辑导致新页面刚推入就被销毁退回。

临时解决方案

方案1:移除TabView内部冗余NavigationView(推荐)

你的示例代码中根节点已经初始化了NavigationView,TabView内部不需要再额外嵌套,直接修改ContentView1的实现即可:

struct ContentView1: View {
    var body: some View {
        TabView {
            // 去掉内部的NavigationView,复用外层导航栈
            NavigationLink(destination: ContentView2()) {
                Text("To ContentView2")
            }
            VStack {
                Text("Screen2")
            }
        }
    }
}

这个方案改动最小,完全符合watchOS的导航设计规范,无副作用。

方案2:手动绑定NavigationLink状态(适用于需要Tab子项独立导航栈的场景)

如果业务逻辑要求每个Tab页有独立的导航层级,可以通过isActive参数手动控制跳转,绕过系统自动判断的bug:

struct ContentView1: View {
    // 手动维护跳转状态
    @State private var showContentView2 = false
    
    var body: some View {
        TabView {
            NavigationView {
                NavigationLink(isActive: $showContentView2) {
                    ContentView2()
                } label: {
                    Button {
                        showContentView2 = true
                    } label: {
                        Text("To ContentView2")
                    }
                }
            }
            VStack {
                Text("Screen2")
            }
        }
    }
}

版本兼容说明

该原生bug在watchOS 9及以上版本已经被苹果官方修复,不需要额外适配;上述两个workaround在watchOS 8.1~8.8所有版本均验证有效,同时兼容watchOS 8.0及更早版本。

内容的提问来源于stack exchange,提问作者Raphaël Barthomeuf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:45:06