Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免SwiftUI中嵌套的导航栏?_Swift_Xcode_Swiftui - Fatal编程技术网

如何避免SwiftUI中嵌套的导航栏?

如何避免SwiftUI中嵌套的导航栏?,swift,xcode,swiftui,Swift,Xcode,Swiftui,使用SwiftUI,我构建了一个NavigationView,它将用户带到另一个NavigationView,最后是一个简单视图。当我到达最后一个视图时,我可以看到两个后退按钮和一个非常大的导航栏 我希望有一个类似iOS设置应用程序的导航结构,其中一个导航列表指向另一个导航列表,每个导航列表都有一个返回到上一屏幕的后退按钮 有人知道如何解决这个问题吗?在视图层次结构中,您应该只有一个导航视图,作为菜单视图的祖先。然后,您可以在该层次结构下的任何级别使用NavigationLinks 例如,您的

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

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


有人知道如何解决这个问题吗?

在视图层次结构中,您应该只有一个
导航视图
,作为菜单视图的祖先。然后,您可以在该层次结构下的任何级别使用
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")
        }
    }
}
然后,您的菜单视图将导航链接到相应的视图:

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)
            }
        }
    }
}
结果:


如果您使用NavigationLinks创建菜单视图,但不在NavigationView中声明它,您将获得没有NavigationBar的子视图。

Rob,您既是天使又是天才!非常感谢你的帮助!当我从
导航链接
推送一个新的
列表
时,我的模拟器/画布冻结,并且不会抛出任何错误。还有其他人遇到过这个问题吗?我已经克隆了上面的代码,但仍然遇到相同的问题。是的,我确实遇到了相同的冻结问题。你能解决它吗?@IronJohnBonney我也遇到了这个问题,太令人沮丧了。你找到解决办法了吗?@Spood我确实找到了解决办法。我认为这与我在AppDelegate中定制UINavigationBar的外观有关,然后在一个列表中按一个列表,如前面所述。一旦我摆脱了外观定制,我就没有问题了。我最终不得不从SwiftUI代码中的其他地方自定义外观。我会再次检查,以确保这是我遇到的问题,此时我的记忆消失了。
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()
        }
    }
}