SwiftUI NavigationView尝试弹出到丢失的目的地Monoceros?

问题描述

我正在将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的子视图有关吗?

解决方法

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

如果您将 NavigationView 放在 TabView 内,错误不会自行显现,但这当然会导致从您的 Final Screen 内显示选项卡,您可能是尽量避免。

enter image description here

对此的解决方法是隐藏 TabView 的选项卡,使用

UITabBar.appearance().isHidden = true

但目前仅在 UIKit 内可用,因此,在 SwiftUI 目前没有解决方法,到目前为止我们需要等待 Apple 正确实施相应的.navigationBarHidden() 的 TabView 也是如此。

在将 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()

        }
    }

}

如果你这样做,你就不可能得到

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

Xcode 13 / iOS 15

这个问题似乎在 Xcode 13 beta 1 中得到解决。控制台中没有警告,现在将 TabView 放入 NavigationView 中是安全的:

struct ContentView: View {
    var body: some View {
        NavigationView {
            TabView {
                // ...
            }
        }
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...