【问题标题】:SwiftUI: How to “deep-link” to the second/third level of a list in a navigation viewSwiftUI:如何在导航视图中“深度链接”到列表的第二/第三级
【发布时间】:2021-05-05 17:45:43
【问题描述】:

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

这里有一些背景:

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

到目前为止,很容易。现在,这是我尝试做的(也请参考附图):

  • 我想从第一个视图(可能也从其他不相关的视图)直接跳转到子菜单;即位于我的菜单的第二或第三级的列表
  • 到目前为止,我所做的是设置一个程序化导航链接,该链接直接链接到图中名为“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")
    }
}

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

我会很感激任何想法!

【问题讨论】:

  • 现在我的问题是:有没有可能... - 没有。

标签: ios swiftui deep-linking navigationview swiftui-navigationlink


【解决方案1】:

不是最好的解决方案,但如果您想获得深层链接并且仍然能够返回到#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")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2021-12-16
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多