I'm using Xcode 12 with deployment for iOS 14.0.
The navigation on the app is functioning correctly (when I click a NavigationLink on one of the subviews, it navigates to the correct view and when I click the back button, it dismisses the view.) However, when I click the back button, the console prints the following error:
Trying to pop to a missing destination at /Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-103/Shared/NavigationBridge_PhoneTV.swift:337
Aside from the error log, the app is functioning fine, so I'm planning to just ignore the error for now... but I'm wondering what it means? I don't have anything within my code named "Monoceros". I'm guessing it has something to do with the TabView being a subview of the NavigationView?
EDIT:
Several months later, this issue still persists. Here is reproducible code. Open the ContentView(), on the FirstScreen() click on the NavigationLink, then click the back button. It will print out Monoceros lol
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() } }
The . navigationBarBackButtonHidden(true) will hide the back button.
Overview. Use a NavigationView to create a navigation-based app in which the user can traverse a collection of views. Users navigate to a destination view by selecting a NavigationLink that you provide.
NavigationLink in SwiftUI allows pushing a new destination view on a navigation controller. You can use NavigationLink in a list or decide to push a view programmatically. The latter enables you to trigger a new screen from a different location in your view.
Unfortunately this is an active issue with a TabView
placed inside NavigationView
.
The error would not manifest itself if you placed your NavigationView
inside the TabView
, but this of course would lead to the tabs being displayed from within your Final Screen
, which you are probably trying to avoid.
There is currently no work-around for this, and as of to date we need to wait for Apple to properly implement the corresponding .navigationBarHidden()
of TabViews as well.
Problems and unexpected behaviours have been reported when embedding a TabView
into a NavigationView
, however if you have tested your app thoroughly and found no particular problems, it is safe to say that you can stick to this method.
Alternatively you will have to build a TabView
component manually, like below:
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() } } }
The above bug is well detailed in this blog post, which you could consult for further reference and more examples.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With