Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NavigationStack is not showing initial navigation path when presented in a sheet

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:

enter image description here

FullScreenCover presentation:

enter image description here

Is this a bug in SwiftUI or am I missing something? Is this intentional? Does anyone know a fix/workaround?

like image 241
Quantm Avatar asked Oct 21 '25 04:10

Quantm


1 Answers

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]
        }
    }
}
like image 195
ChrisR Avatar answered Oct 22 '25 19:10

ChrisR



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!