How can I avoid nested Navigation Bars in SwiftUI?
You should only have one NavigationView
in your view hierarchy, as an ancestor of the menu view. You can then use NavigationLink
s at any level of the hierarchy under that.
So, for example, your root view could be defined like this:
struct RootView: View { var body: some View { NavigationView { MenuView() .navigationBarItems(trailing: profileButton) } } private var profileButton: some View { Button(action: { }) { Image(systemName: "person.crop.circle") } }}
Then your menu view has NavigationLink
s to the appropriate views:
struct MenuView: View { var body: some View { List { link(icon: "calendar", label: "Appointments", destination: AppointmentListView()) link(icon: "list.bullet", label: "Work Order List", destination: WorkOrderListView()) link(icon: "rectangle.stack.person.crop", label: "Contacts", destination: ContactListView()) link(icon: "calendar", label: "My Calendar", destination: MyCalendarView()) }.navigationBarTitle(Text("Menu"), displayMode: .large) } private func link<Destination: View>(icon: String, label: String, destination: Destination) -> some View { return NavigationLink(destination: destination) { HStack { Image(systemName: icon) Text(label) } } }}
Your appointment list view also contains NavigationLink
s to the appointment detail views:
struct AppointmentListView: View { var body: some View { List { link(destination: AppointmentDetailView()) link(destination: AppointmentDetailView()) link(destination: AppointmentDetailView()) }.navigationBarTitle("Appointments") } private func link<Destination: View>(destination: Destination) -> some View { NavigationLink(destination: destination) { AppointmentView() } }}
Result: