如何解决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")
}
}
这是我想要实现的目标的可视化:
如果有任何想法,我将不胜感激!
解决方法
不是最好的解决方案,但如果您想要实现深层链接并且仍然能够返回到 #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 举报,一经查实,本站将立刻删除。