【问题标题】:SwiftUI: NavigationLink pops out immediately on WatchOS 8.1RC in TabviewSwiftUI:在 Tabview 的 WatchOS 8.1RC 上立即弹出 NavigationLink
【发布时间】:2021-12-08 07:44:21
【问题描述】:

我在 watchOS 8.1RC 中发现了一个回归,其中 NavigationLink 从 TabView 触发。 它立即被驳回。

它在 watchOS 8.0 或模拟器 (watchOS 8.0) 中运行。 你知道解决方法吗? 谢谢

示例代码:

import SwiftUI

@main
struct TestNavigationApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                ContentView()
            }
        }
    }
}

struct ContentView: View {
    var body: some View {
        List {
            NavigationLink(destination: ContentView1()) {
                Text("To TabView")
            }
        }
        
    }
}

struct ContentView1: View {
    var body: some View {
        TabView {
            NavigationView {
                NavigationLink(destination: ContentView2()) {
                    Text("To ContentView2")
                }
            }
            VStack {
                Text("Screen2")
            }
        }
    }
}

struct ContentView2: View {
    var body: some View {
        Text("ContentView2")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【问题讨论】:

  • 如果没有Minimal Reproducible Example,就无法帮助您进行故障排除。代码中的NavigationLink 没有机会工作。
  • 为什么?它在 watchOS 7 或 8 中运行良好……如果你能解释一下为什么 le 代码是错误的……
  • 将确切的代码放入一个空白项目中,看看它是否重现了您的问题
  • 在应用程序中见证相同的行为。在 8.0 的设备上很好,升级到 8.1 的设备每次都会从导航链接视图中弹出。 Apple 方面的 8.1 发生了一些变化,因为它一直工作到 7.3(当我们第一次为我们的应用实现 UI 时)。
  • 问题仍然存在于 watchOS 8.3 beta1

标签: swiftui apple-watch swiftui-navigationlink swiftui-tabview 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(alignment: .center, spacing: 12, content: {
                
                // content 2nd tab: we didn't have a list in the 2nd tab
            })
            .tag(2)
        }
    }
}

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

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

【讨论】:

  • 感谢您的提示,但就我而言,它并没有给出好的结果。我必须等待Apple修复。我将使用最后一个测试版进行测试,以检查它是否仍然损坏。目前我对 .sheet 使用了一种奇怪的解决方法