微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI:如何在导航视图中“深层链接”到列表的第二/第三级

如何解决SwiftUI:如何在导航视图中“深层链接”到列表的第二/第三级

我最近在导航视图中遇到了“深层链接”到列表第三级的问题。

这里是一些背景:

  • 我的应用有一个基于 SwiftUI 列表/表单的设置菜单
  • 作为典型的菜单,您可以从一个列表项跳转到下一个列表(“更深”一级) - 这是 NavigationLink 实现的
  • 由于顶层的列表嵌入在导航视图中,SwiftUI 会自动向较低层的子视图添加“返回”按钮以返回到第一个菜单页面

到目前为止,很简单。现在,这是我尝试做的事情(另请参阅附图):

  • 我想从第一个视图(也可能从其他不相关的视图)直接跳转到 as 子菜单;即在我的菜单的第二级或第三级的列表
  • 到目前为止,我所做的是设置一个程序化导航链接,该链接直接链接到图中名为“View 3”的内容。但是,这不提供通过导航视图中的后退按钮跳回“视图 2”然后跳转到“视图 1”的可能性

现在我的问题是:是否有可能跳转到“视图 3”(可能从我应用程序的任何地方),并且仍然能够返回到“视图 2”,然后通过导航视图中的后退按钮?

这是视图 1:

struct SwiftUIView1: View {
    var body: some View {
        NavigationView {
            vstack {
                List {
                    NavigationLink("Link",destination: SwiftUIView2())
                    Text("TBD")
                    Text("TBD")
                }
                .navigationTitle("View 1")
                Button("Jump to view 3",action: XXX) // <-- What to put here?
            }
        }
    }
}

这是视图 2:

struct SwiftUIView2: View {
    var body: some View {
        List {
            NavigationLink("Link",destination: SwiftUIView3())
            Text("TBD")
            Text("TBD")
        }
        .navigationTitle("View 2")
    }
}

这是视图 3:

struct SwiftUIView3: View {
    var body: some View {
        Text("Hello world")
        .navigationTitle("View 3")
    }
}

这是我想要实现的目标的可视化:

enter image description here

如果有任何想法,我将不胜感激!

解决方法

不是最好的解决方案,但如果您想要实现深层链接并且仍然能够返回到 #2#1,您可以尝试此解决方案。

它会自动从 #1 转到 #3,但是经过 #2。否则,您将无法获得后退按钮并返回 #2。这是不可能的,因为它是默认的导航行为...

class NavigationManager: ObservableObject {
    @Published var goToThird: Bool = false
}

struct ContentView: View {
    @State var isActive: Bool = false
    var navigationManager = NavigationManager()
    
    var body: some View {
        NavigationView {
            VStack {
                List {
                    NavigationLink("Link",destination: SwiftUIView2(manager: navigationManager),isActive: $isActive)
                    Text("TBD")
                    Text("TBD")
                }
                .navigationTitle("View 1")
                Button("Jump to view 3",action: {
                    isActive = true
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                        navigationManager.goToThird = true
                    }
                }) // <-- What to put here?
            }
        }
    }
}

struct SwiftUIView2: View {
    @ObservedObject var manager: NavigationManager

    var body: some View {
        List {
            NavigationLink("Link",destination: SwiftUIView3(),isActive: $manager.goToThird)

            Text("TBD")
            Text("TBD")
        }
        .navigationTitle("View 2")
    }
}

struct SwiftUIView3: View {
    var body: some View {
        Text("Hello world")
        .navigationTitle("View 3")
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。