Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Remove specific screen from NavigationView in SwiftUI

Currently i am using NavigationView->NavigationLink to navigate one screen to another. How can i remove specific screen from NavigationView?

For Example I have four screen A, B, C and D. The navigation chain like this A->B-C->D. From Screen D how can i go back in Screen B and then Sceen A

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

To achieve this, you need to the new NavigationStack for iOS 16 which allows programmatic navigation.

The NavigationStack takes a path parameter; and array that you add or remove objects to, representing your navigation stack. Use the navigationDestination modifier to decide which actual views to push on the stack based on the contents of the path.

Example:

enum NavView {
    case b, c, d
}

struct ContentView: View {
    
    @State private var path: [NavView] = []
    
    var body: some View {
        NavigationStack(path: $path) {
            VStack {
                NavigationLink("Show B", value: NavView.b)
                    .navigationTitle("View A")
            }
            .navigationDestination(for: NavView.self) { view in
                switch view {
                case .b: ViewB(path: $path)
                case .c: ViewC(path: $path)
                case .d: ViewD(path: $path)
                }
            }
        }
    }
}

struct ViewB: View {
    @Binding var path: [NavView]
    var body: some View {
        NavigationLink("Show C", value: NavView.c)
            .navigationTitle("View B")
    }
}

struct ViewC: View {
    @Binding var path: [NavView]
    var body: some View {
        Button("Show D", action: { path.append(NavView.d) })
            .navigationTitle("View C")
    }
}

struct ViewD: View {
    @Binding var path: [NavView]
    var body: some View {
        Button("Back to B", action: { path.removeLast(2) })
            .navigationTitle("View D")
    }
}

Note that the navigationDestination modifier is not on the NavigationStack, but one one of its contained views.

enter image description here

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading