Search code examples
swiftuiswiftui-navigationlink

In SwiftUI, iOS15, 2nd level NavigationLink, isActive is not working


in iOS15, it is not working:

import SwiftUI
struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                Dest1().navigationTitle("Dest1")
            } label: {
                Text("to Destination 1")
            }
        }
    }
}

struct Dest1: View {
    @State var dest2Active: Bool = false
    var body: some View {
        NavigationLink(
            destination: Button {
                dest2Active = false // not working!!
            } label: {Text("dismiss")} .navigationTitle("Dest2"),
            isActive: $dest2Active
        ) {Text("to Destination 2")}
    }
}

The dismiss button in Dest2 is not working! I remember that in iOS14, this code works well. How to resolve this?


Solution

  • You need to add .navigationViewStyle(.stack) to make it work. Here is the test code that works for me.

    import SwiftUI
    
    @main
    struct TestApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
    struct ContentView: View {
        var body: some View {
            NavigationView {
                NavigationLink {
                    Dest1().navigationTitle("Dest1")
                } label: {
                    Text("to Destination 1")
                }
            }.navigationViewStyle(.stack) // <-- here the important bit
        }
    }
    
    struct Dest1: View {
        @State var dest2Active: Bool = false
        var body: some View {
            NavigationLink(
                destination: Button {
                    dest2Active = false // now working!!
                } label: {Text("dismiss")} .navigationTitle("Dest2"),
                isActive: $dest2Active
            ) {Text("to Destination 2")}
        }
    }