SwiftedMind
SwiftedMind

Reputation: 4307

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?

Upvotes: 4

Views: 916

Answers (1)

ChrisR
ChrisR

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

Related Questions