【问题标题】:SwiftUI: NavigationView bug in WatchOS 8.1 When List and ForEach is embedded in TabViewSwiftUI:当 List 和 ForEach 嵌入 TabView 时 WatchOS 8.1 中的 NavigationView 错误
【发布时间】:2021-12-13 06:27:37
【问题描述】:

下面的代码在 WatchOS 7 和 8.0 中运行良好,但现在在 8.1 中点击该行将导航到目的地,然后立即导航回根视图。

我提交了反馈 #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")
                }
            }
            
        }
    }
}

【问题讨论】:

标签: swiftui apple-watch swiftui-navigationlink watchos-8


【解决方案1】:

watchOS 8.1(和 8.3 beta)在使用之前的 watchOS 版本时遇到了同样的问题。

我们可以通过将NavigationView 移动到TabView 中来使其再次工作。 这种解决方法一点也不理想,但似乎确实有效。

@State private var tabSelection = 1

var body: some Scene {
    WindowGroup {
        TabView(selection: $tabSelection) {
            NavigationView {
                // List goes here
            }
            .tag(1)
            
            VStack {
                // content 2nd tab: we didn't have a list in the 2nd tab
            }
            .tag(2)
        }
    }
}

但是,此修复会影响两件事:

  • 我没有让navigationBarTitle 工作,所以屏幕顶部不会有标题。
  • 如果您单击列表中的某个项目,它将导航到您的页面(如预期的那样),但屏幕底部的 TabView 点将保留。

【讨论】:

  • 谢谢,不是一个理想的解决方案,但感谢您的提示。您提交反馈了吗?
  • @GarySabo 我没有提交反馈单。你认为如果我提交额外的票会有帮助吗?
  • 是的!反馈越多,它将在内部获得更高的优先级。特别是对于仅在 WatchOS 中没有像 iOS 那样受到关注的东西。我包含了一个演示项目,可以轻松显示问题。