l30c0d35
l30c0d35

Reputation: 807

NavigationLink isActive does not work inside navigationBarItems(trailing:) modifier

I am using the newest versions of Xcode (11 Beta 16) and macOS (10.15 Beta 6)

I am trying to create two views. From the first one view you should be able to navigate to the second one view via the trailing navigation bar item and to navigate back you should be able to use the system generated back button (which works) and additionally a trailing navigation bar button (which has some additional functionality like saving the data but this is not important for my problem).

Option 1 does work but if you comment out option 1 and uncomment option 2 (my wanted layout) the done button just does not navigate back.

struct ContentView1: View {
    @State var show = false

    var body: some View {
        NavigationView {
            Form {
                Text("View 1")
//          Option 1 that does work
                NavigationLink(destination: ContentView2(show: $show), isActive: $show) {
                    Text("Move")
                }
            }
            .navigationBarTitle(Text("Title"))
//          Option 2 that does NOT work
//            .navigationBarItems(trailing: NavigationLink(destination: ContentView2(show: $show), isActive: $show) {
//                Text("Move")
//            })
        }
    }
}

struct ContentView2: View {
    @Binding var show: Bool

    var body: some View {
        Form {
            Text("View 2")
            Text(show.description)
        }
        .navigationBarItems(trailing: Button(action: {
            self.show = false
        }, label: {
            Text("Done")
        }))
    }
}

Any suggestions how to fix that?

Upvotes: 1

Views: 1893

Answers (1)

kontiki
kontiki

Reputation: 40539

Option 2 plays nicely with presentationMode:

struct ContentView2: View {
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        Form {
            Text("View 2")
        }
        .navigationBarItems(trailing: Button(action: {
            self.presentationMode.wrappedValue.dismiss()
        }, label: {
            Text("Done")
        }))
    }
}

Upvotes: 5

Related Questions