Reputation: 4307
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?
Upvotes: 4
Views: 916
Reputation: 12165
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]
}
}
}
Upvotes: 2