如何避免 SwiftUI 中的嵌套导航栏?
How can I avoid nested Navigation Bars in SwiftUI?
我使用 SwiftUI 构建了一个 NavigationView,它将用户带到另一个 NavigationView,最后带到一个简单的 View。当我到达最后一个视图时,我可以看到两个后退按钮和一个非常大的导航栏。
我想要一个类似于 iOS 设置应用程序的导航结构,其中一个导航列表转到另一个导航列表,每个导航列表都有一个返回上一屏幕的后退按钮。
有人知道怎么解决吗?
您的视图层次结构中应该只有一个 NavigationView
,作为菜单视图的祖先。然后,您可以在该层次结构的任何级别使用 NavigationLink
s。
因此,例如,您的根视图可以这样定义:
struct RootView: View {
var body: some View {
NavigationView {
MenuView()
.navigationBarItems(trailing: profileButton)
}
}
private var profileButton: some View {
Button(action: { }) {
Image(systemName: "person.crop.circle")
}
}
}
那么您的菜单视图有 NavigationLink
到适当的视图:
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)
}
}
}
}
您的约会列表视图还包含 NavigationLink
到约会详细信息视图:
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()
}
}
}
结果:
如果您使用 NavigationLinks 创建菜单视图但不在 NavigationView 中声明它,您将获得没有 NavigationBar 的子视图。
我使用 SwiftUI 构建了一个 NavigationView,它将用户带到另一个 NavigationView,最后带到一个简单的 View。当我到达最后一个视图时,我可以看到两个后退按钮和一个非常大的导航栏。
我想要一个类似于 iOS 设置应用程序的导航结构,其中一个导航列表转到另一个导航列表,每个导航列表都有一个返回上一屏幕的后退按钮。
有人知道怎么解决吗?
您的视图层次结构中应该只有一个 NavigationView
,作为菜单视图的祖先。然后,您可以在该层次结构的任何级别使用 NavigationLink
s。
因此,例如,您的根视图可以这样定义:
struct RootView: View {
var body: some View {
NavigationView {
MenuView()
.navigationBarItems(trailing: profileButton)
}
}
private var profileButton: some View {
Button(action: { }) {
Image(systemName: "person.crop.circle")
}
}
}
那么您的菜单视图有 NavigationLink
到适当的视图:
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)
}
}
}
}
您的约会列表视图还包含 NavigationLink
到约会详细信息视图:
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()
}
}
}
结果:
如果您使用 NavigationLinks 创建菜单视图但不在 NavigationView 中声明它,您将获得没有 NavigationBar 的子视图。