WatchOS 8.1下SwiftUI TabView内嵌List、ForEach时NavigationView跳转异常bug
问题表现
相同代码在WatchOS 7、8.0版本运行无异常,升级到WatchOS 8.1后,点击列表中NavigationLink跳转到目标页面时会立即自动返回根视图。该问题已提交苹果官方反馈,反馈编号为FB9727188。
问题复现代码
struct ContentView: View { @State var tabIndex:Int = 0 var body: some View { TabView(selection: $tabIndex) { ListView() .tabItem { Group { Text("List") } } .tag(0) .padding(.bottom, 1.0) Text("Second View") .tabItem { Group { Text("Second") } } .tag(1) .padding(.bottom, 1.0) Text("Third View") .tabItem { Group { Text("ThirdView") } } .tag(2) } } } struct ListView: View { var body: some View { List { ForEach((1...10).reversed(), id: \.self) {_ in NavigationLink(destination: Text("test")) { Text("Tap Me but we'll just be back here") } } } } }
根因说明
该问题为WatchOS 8.1的系统原生bug,TabView的选中状态切换逻辑异常导致页面状态意外刷新,NavigationLink的跳转栈被强制重置。
临时规避方案
- 方案1:在整体TabView的外层包裹
NavigationView,并指定.navigationViewStyle(.stack)适配WatchOS布局 - 方案2:给每个Tab对应的子页面单独包裹一层
NavigationView,仅在需要导航跳转的页面配置导航栈 - 方案3:若不需要多Tab切换逻辑,可临时移除TabView使用单一导航栈布局,待系统版本修复后再恢复原逻辑
内容的提问来源于stack exchange,提问作者GarySabo
相关产品推荐
相关产品推荐

