【问题标题】:SwiftUI NavigationView trying to pop to missing destination (Monoceros?)SwiftUI NavigationView 试图弹出到丢失的目的地(Monoceros?)
【发布时间】:2021-01-15 08:29:28
【问题描述】:

我将 Xcode 12 用于 iOS 14.0 的部署。

  • 我的主屏幕有一个 NavigationView
  • 在 NavigationView 中有一个 TabView(有 4 个选项卡)
  • 每个选项卡中都有包含按钮和导航链接的子视图

应用程序上的导航功能正常(当我单击其中一个子视图上的 NavigationLink 时,它会导航到正确的视图,当我单击后退按钮时,它会关闭视图。)但是,当我单击后退时按钮,控制台打印以下错误:

Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-103/Shared/NavigationBridge_PhoneTV.swift:337

除了错误日志之外,该应用程序运行良好,所以我打算暂时忽略该错误......但我想知道这意味着什么?我的代码中没有任何名为“Monoceros”的内容。我猜它与 TabView 作为 NavigationView 的子视图有关?

编辑:

几个月后,这个问题仍然存在。这是可重现的代码。打开 ContentView(),在 FirstScreen() 上单击 NavigationLink,然后单击返回按钮。它会打印出 Monoceros 哈哈

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            TabView {
                FirstScreen()
                    .tabItem {
                        Text("One")
                        Image(systemName: "house.fill")
                    }
                
                Text("Second Screen")
                    .tabItem {
                        Text("Two")
                        Image(systemName: "heart.fill")
                    }
            }
        }
    }
}

struct FirstScreen: View {
    var body: some View {
        NavigationLink("Click here", destination: Text("Final Screen"))
        // Click the back button on FinalScreen prints:
        //Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-120/Shared/NavigationBridge_PhoneTV.swift:341
    }
}

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

【问题讨论】:

  • 你解决了吗?
  • 不。我认为这是因为 TabView 是 NavigationView 的子视图。如果您改为将 NavigationView 添加为 TabView 中的子视图,错误就会消失。然而,这改变了用户界面并且对我们不起作用。我们最终只是忽略了错误并发布到 App Store。据我所知,该错误并未引起任何问题。
  • 你能提供一个可重现的例子吗?
  • @pawello2222 已更新。谢谢
  • @nicksarno 你能解决抛出的错误信息吗?我遇到与您完全相同的用例完全相同的问题...我不介意错误但不想在提交应用程序时被苹果拒绝!?

标签: swift xcode swiftui navigationview swiftui-navigationlink


【解决方案1】:

不幸的是,这是一个活跃的问题,TabView 放置在 NavigationView 中。

如果您将NavigationView 放在TabView 中,该错误不会显示出来,但这当然会导致标签从您的Final Screen 中显示,您可能正试图避免这种情况。

                                     

目前还没有解决方法,到目前为止,我们还需要等待 Apple 正确实现 TabViews 对应的.navigationBarHidden()

TabView 嵌入NavigationView 时出现问题和意外行为reported,但是如果您已经彻底测试了您的应用程序并没有发现特别问题,可以肯定地说您可以坚持这种方法.

或者,您必须手动构建一个TabView 组件,如下所示:

import SwiftUI


enum Tab {
    case house, heart
}

struct TabView: View {
    @Binding var tabIdx: Tab
    
    var body: some View {
        HStack {
            Group {
                Spacer()
                
                Button (action: {
                    self.tabIdx = .house
                }) {
                    VStack{
                        Image(systemName: "house.fill")
                        Text("House")
                            .font(.system(size: 10))

                    }
                }
                .foregroundColor(self.tabIdx == .house ? .blue : .secondary)
                
                Spacer()
                
                Button (action: {
                    self.tabIdx = .heart
                }) {
                    VStack{
                        Image(systemName: "heart.fill")
                        Text("Heart")
                            .font(.system(size: 10))

                    }
                }
                .foregroundColor(self.tabIdx == .heart ? .blue : .secondary)
                
                Spacer()
            }
        }
        .padding(.bottom, 30)
        .padding(.top, 10)
        .background(Color(red: 0.1, green: 0.1, blue: 0.1))
        .font(.system(size: 30))
        .frame(height: 80)
    }
}

struct FirstScreen: View {
    var body: some View {
        NavigationLink("Click here", destination: Text("Final Screen"))
            .font(.system(size:20))
    }
}

struct ContentView: View {
    @State var tabIdx: Tab = .house
    
    var body: some View {
        NavigationView {
            VStack(spacing: 20) {
                Spacer()
                if tabIdx == .house {
                    FirstScreen()
                } else if tabIdx == .heart {
                    Text("Second Screen")
                }
                Spacer(minLength: 0)
                TabView(tabIdx: self.$tabIdx)
            }
            .ignoresSafeArea()

        }
    }

}

this 博文中详细介绍了上述错误,您可以查阅该博文以获取更多参考和更多示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多