SwiftUI:当 List 和 ForEach 嵌入 TabView 时 WatchOS 8.1 中的 NavigationView 错误

Posted

技术标签:

【中文标题】SwiftUI:当 List 和 ForEach 嵌入 TabView 时 WatchOS 8.1 中的 NavigationView 错误【英文标题】:SwiftUI: NavigationView bug in WatchOS 8.1 When List and ForEach is embedded in TabView 【发布时间】: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")
                
            
            
        
    

【问题讨论】:

***.com/questions/69663736/… 相关。在项目中也看到了这一点。 你有苹果反馈的公共链接吗? @BradMartin 你能看到吗? feedbackassistant.apple.com/feedback/9727188 【参考方案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 那样受到关注的东西。我包含了一个演示项目,可以轻松显示问题。

以上是关于SwiftUI:当 List 和 ForEach 嵌入 TabView 时 WatchOS 8.1 中的 NavigationView 错误的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 使用 List 和 Foreach 遍历字典中的键并创建列表视图

SwiftUI - 如果在 ForEach 循环内

索引超出范围 SwiftUI

SwiftUI 的 List/ForEach 视图中是不是可以有一个 Button(action: -)

List 中的 ForEach 出现 SwiftUI 错误:无法使用类型为 '(@escaping () ... 的参数列表调用类型为 'List' 的初始化程序...(参见代码)

SwiftUI 自定义 List 不能在 ForEach 中使用 Binding