使用SwiftUI,我构建了一个NavigationView,它将用户带到另一个NavigationView,最后是一个简单视图.当我到达最后一个视图时,我可以看到两个后退按钮和一个非常大的导航栏.

GIF显示嵌套导航栏

我希望有一个类似iOS设置应用程序的导航 struct ,其中一个导航列表指向另一个导航列表,每个导航列表都有一个返回到上一屏幕的后退按钮.

有人知道怎么解决这个问题吗?

推荐答案

视图层次 struct 中应该只有一个NavigationView,作为菜单视图的祖先.然后,您可以在该层次 struct 下的任何级别使用NavigationLink.

例如,根视图可以这样定义:

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()
        }
    }
}

结果:

demo

Swift相关问答推荐

当TextField变为空时,不会触发onChange

Result类型的初始值设定项失败?

如何从UIKit中的AttributeContainer获取属性并将其分配给某个变量

如何使用Swift宏和@Observable和@Environment?

为什么我的Swift app不能用xcodebuild构建,但是用XCode可以构建?

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

如何为等待函数调用添加超时

格式化大货币数字

Swift 非参与者隔离闭包

异步等待不会在项目中触发,但在 Xcode playground 中工作正常

AES 加密和解密

Swift中switch 盒的详尽条件

是 swift 中另一个日期的同一周、月、年的日期

try 在解除分配时加载视图控制器的视图... UIAlertController

协议扩展中的where self是什么

在 Swift 中为 UIPickerView 设置默认值?

更改在变量的 willSet 块中设置的值

使用 JSONEncoder 对类型为 Codable 的变量进行编码

将 UIImage 剪成圆形

ISO8601DateFormatter 不解析 ISO 日期字符串