SwiftUI NavigationView 试图弹出到丢失的目的地(Monoceros?)

nic*_*rno 21 xcode swift navigationview swiftui swiftui-navigationlink

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-103/Shared/NavigationBridge_PhoneTV.swift:337
Run Code Online (Sandbox Code Playgroud)

BiO*_*iOS 10

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

该错误也不会表现出来,如果你放在你的NavigationView里面TabView,但是这当然会导致标签被显示在您的内Final Screen,这你可能试图避免的。

                                      在此处输入图片说明

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

将 a 嵌入到 a时已经报告了问题和意外行为,但是如果您已经彻底测试了您的应用程序并且没有发现特别问题,那么可以肯定地说您可以坚持使用这种方法。TabViewNavigationView

或者,您必须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()

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的错误在这篇博文中有详细的介绍,您可以参考以获取更多参考和更多示例。