Search code examples
iosswiftswiftuiswiftui-navigationlinkxcode12

SwiftUI toolbar not showing on a NavigationLink view


I'm trying to show a toolbar on a view that is inside to navigation links. When I navigate to the third view I get the following message:

2020-09-15 23:09:31.097289-0500 CountTime[35018:3542166] [Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.

And the toolbar is not shown. This happens only on iPhone, not iPad. I'm using Xcode 12 GM.

Here is the code:

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(
                destination: SecondView(),
                label: {
                    Text("Navigate")
                })
        }
    }
}

struct SecondView: View {
    var body: some View {
        ZStack {
            NavigationLink(
                destination: Text("Destination")
                    .toolbar {
                        ToolbarItem(placement: ToolbarItemPlacement.bottomBar) {
                                Button(action: {
                                    print("sharing")
                                }) {
                                    Image(systemName: "square.and.arrow.up")
                                }
                        }
                    },
                label: {
                    Text("Navigate")
                })
        }
    }
}

Solution

  • displayModeButtonItem is internally managed and not exposed for DoubleColumn style

    In your case SwiftUI for some reason tries to present a NavigationView in a DoubleColumn style.

    A possible solution is to specify the style explicitly:

    struct ContentView: View {
        var body: some View {
            NavigationView {
                NavigationLink(destination: SecondView()) {
                    Text("Navigate")
                }
            }
            .navigationViewStyle(StackNavigationViewStyle())
        }
    }