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
相关产品推荐
相关产品推荐

