I want to present a view with a NavigationStack that has an initial path. This almost always works, but not when that view is presented as a sheet. Then, it only shows the root view of the NavigationStack.
Here is a fully working example:
struct TestView: View {
@State var isShowingSheet = false
@State var isShowingFullscreenCover = false
var body: some View {
VStack {
Button("Show Sheet") {
isShowingSheet = true
}
Button("Show Fullscreen Cover") {
isShowingFullscreenCover = true
}
}
.sheet(isPresented: $isShowingSheet) {
// Opens at the root (Showing the "Root" text below)
PresentedView()
}
.fullScreenCover(isPresented: $isShowingFullscreenCover) {
// Opens with page "5", which is the top of the intially defined navigation stack from `path`
PresentedView()
}
}
}
struct PresentedView: View {
@State var path: [Int] = [1, 2, 3, 4, 5]
var body: some View {
NavigationStack(path: $path) {
Text("Root")
.navigationDestination(for: Int.self) { number in
Text("\(number)")
.navigationTitle("\(number)")
}
}
}
}
Sheet presentation:

FullScreenCover presentation:

Is this a bug in SwiftUI or am I missing something? Is this intentional? Does anyone know a fix/workaround?
To me this is a bug.
Here is a workaround setting the path in .onAppear. But watch the still different behavior of sheet and fullscreencover.
The strangest thing is that for sheet to work, the path has to be initially empty !?
struct PresentedView: View {
@State var path: [Int] = []
var body: some View {
NavigationStack(path: $path) {
Text("Root")
.navigationDestination(for: Int.self) { number in
Text("\(number)")
.navigationTitle("\(number)")
}
.navigationTitle("Root")
}
.onAppear {
path = [1,2,3,4,5]
}
}
}
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