swiftuinavigationcontrollerswiftuinavigationlink

Push, pop view controller equivalent in SwiftUI


What's equivalent to the Push and Pop of a view controller in SwiftUI?


Solution

  • Root :

    window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(Model()))
    

    iOS version 13.1 :

    class Model: ObservableObject {
        @Published var pushed = false
    }
    
    struct ContentView: View {
        @EnvironmentObject var model: Model
    
        var body: some View {
            NavigationView {
                VStack {
                    Button("Push") {
                        self.model.pushed = true
                    }
    
                    NavigationLink(destination: DetailView(), isActive: $model.pushed) { EmptyView() }
                }
            }
        }
    }
    
    struct DetailView: View {
        @EnvironmentObject var model: Model
    
        var body: some View {
            Button("Bring me Back") {
                self.model.pushed = false
            }
        }
    }
    

    Removing the default back button and adding our own will let us get through, until the bug gets fixed by Apple.

    class Model: ObservableObject {
        @Published var pushed = false
    }
    
    struct ContentView: View {
        @EnvironmentObject var model: Model
    
        var body: some View {
            NavigationView {
                VStack {
                    Button("Push") {
                        self.model.pushed = true
                    }
    
                    NavigationLink(destination: DetailView(), isActive: $model.pushed) { EmptyView() }
                }
            }
        }
    }
    
    struct DetailView: View {
        @EnvironmentObject var model: Model
    
        var body: some View {
            Button("Bring me Back") {
                self.model.pushed = false
            }
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: MyBackButton(label: "Back!") {
                self.model.pushed = false
            })
        }
    }
    
    struct MyBackButton: View {
        let label: String
        let closure: () -> ()
    
        var body: some View {
            Button(action: { self.closure() }) {
                HStack {
                    Image(systemName: "chevron.left")
                    Text(label)
                }
            }
        }
    }
    

    more to refer