【问题标题】:SwiftUI: Navigating to a view within the view hierarchySwiftUI:导航到视图层次结构中的视图
【发布时间】:2020-01-10 09:31:13
【问题描述】:

我目前所拥有的:

我有两个视图,第一个我的ContentView 将被加载到SceneDelegate 中的scene(_:willConnectTo:options:) 方法中(这是标准的)。我已将NavigationView 嵌入到我的ContentView 的body 属性中。第二个视图DetailView 可以通过NavigationLink 导航到,要导航回来,您可以使用NavigationView 创建的后退按钮。

struct ContentView: View {
    var body: some View {
        NavigationView {
            Form {
                NavigationLink(destination: DetailView()) {
                    Text("Navigate")
                }
            }
            .navigationBarTitle("Some Title")
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("Detail")
        .navigationBarTitle("Another Title")
    }
}

SceneDelegate 中的scene(_:willConnectTo:options:) 方法内:

let contentView = ContentView()

if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = UIHostingController(rootView: contentView)
    self.window = window
    window.makeKeyAndVisible()
}

我想做的事:

现在我想根据SceneDelegatescene(_:willConnectTo:options:) 方法中的connectionOptions 立即导航到DetailView

我的问题:

当我根据connectionOptionslet contentView = ContentView() 替换为let contentView = DetailView 时,我的ContentView 不再在我的视图层次结构中,因此我没有NavigationView 布局。

问题:

如何导航到我的视图层次结构中的某个视图,而不会丢失由 NavigationView 在另一个视图中创建的任何导航功能(包括导航栏、后退按钮以及能够更深入地导航)?

【问题讨论】:

  • 认为 诀窍是在您的 NavigationLink 上使用 isActive。我在一个隐藏的地方使用它来自动触发推送导航,我通过一个问题了解到这个技巧,有人指出如果将isActive 设置为true,你将立即被带到目的地。按原样绑定isActive value to your model, keep your ContentView`,如果我们希望您的应用在详细视图中打开,只需在您的模型中执行即可。
  • 是的,这是有道理的,并且可能会起作用,但是当您有很多视图的深层层次结构时,您真的必须在所有 NavigationLink 上将所有 isActive 参数设置为 true 吗?
  • 我并不想听起来很挑剔 - 请记住,SwiftUI 仍处于测试阶段 - 如果您有一个较深的层次结构,您希望您的启动视图成为两个以上视图之一,也许是时候了重新考虑你的层次结构。
  • 不,我只是说它看起来有点迂回,但就像你说的它仍然是一个测试版。例如,当您使用 Handoff 时,视图通常在层次结构中嵌套得更深一些。
  • @L.Stephan 回答您我需要准确了解您的期望,有两种可能性:1)您希望 DetailView 的后退按钮位于顶部并能够返回即使您使用 DetailView 作为第一个视图来启动应用程序,也可以添加到 ContentView。 2)当您将 DetailView 用作您的第一个应用程序视图时,您希望在 DetailView 中具有导航功能,但只是为了“更深入地导航”,并且您不希望在这种情况下能够使用后退按钮返回 ContentView . (请相应地编辑您的问题)

标签: swift navigation swiftui


【解决方案1】:

使用NavigationLink(_,destination:,tag:,selection:) 并将selection 绑定到来自connectionOptions 的相关数据。

详细解释和示例代码见https://nalexn.github.io/swiftui-deep-linking/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多