SwiftUI ToolbarItem doesn't present a View from a NavigationLink

NavigationLink should be inside NavigationView. Toolbar is not in NavigationView, put buttons in it.

So assuming you have somewhere in parent

NavigationView {
   MyView()
}

here is a solution:

struct MyView: View {
  
  @ObservedObject var viewModel = MyViewModel()
  @State private var showNew = false

  var body: some View {
    List(viewModel.data, id: \.name) { data in
      NavigationLink(destination: MyDetailView(data: data.name)) {
        Text(data.name)
      }
    }
    .listStyle(InsetGroupedListStyle())
    .background(
        NavigationLink(destination: MyDetailView(), isActive: $showNew) {
          EmptyView()
        }
    )
    .edgesIgnoringSafeArea(.all)
    .toolbar {
      ToolbarItem(placement: .navigationBarTrailing) {  
        Button("New Element") {
            self.showNew = true
        }
      }
    }
  }
}

I found using an HStack with an empty text as the first element also works, it lets the navigationLink act correctly.

        .toolbar {
        ToolbarItem(placement: .navigationBarLeading) {
            HStack {
                Text("")
                NavigationLink(destination: SettingsView()) {
                    Image(systemName: "gear")
                        .font(.title)
                }
            }
        }

Tags:

Swiftui