【发布时间】: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()
}
我想做的事:
现在我想根据SceneDelegate 中scene(_:willConnectTo:options:) 方法中的connectionOptions 立即导航到DetailView。
我的问题:
当我根据connectionOptions 将let contentView = ContentView() 替换为let contentView = DetailView 时,我的ContentView 不再在我的视图层次结构中,因此我没有NavigationView 布局。
问题:
如何导航到我的视图层次结构中的某个视图,而不会丢失由 NavigationView 在另一个视图中创建的任何导航功能(包括导航栏、后退按钮以及能够更深入地导航)?
【问题讨论】:
-
我 认为 诀窍是在您的
NavigationLink上使用isActive。我在一个隐藏的地方使用它来自动触发推送导航,我通过一个问题了解到这个技巧,有人指出如果将isActive设置为true,你将立即被带到目的地。按原样绑定isActive value to your model, keep yourContentView`,如果我们希望您的应用在详细视图中打开,只需在您的模型中执行即可。 -
是的,这是有道理的,并且可能会起作用,但是当您有很多视图的深层层次结构时,您真的必须在所有 NavigationLink 上将所有 isActive 参数设置为 true 吗?
-
我并不想听起来很挑剔 - 请记住,SwiftUI 仍处于测试阶段 - 如果您有一个较深的层次结构,您希望您的启动视图成为两个以上视图之一,也许是时候了重新考虑你的层次结构。
-
不,我只是说它看起来有点迂回,但就像你说的它仍然是一个测试版。例如,当您使用 Handoff 时,视图通常在层次结构中嵌套得更深一些。
-
@L.Stephan 回答您我需要准确了解您的期望,有两种可能性:1)您希望 DetailView 的后退按钮位于顶部并能够返回即使您使用 DetailView 作为第一个视图来启动应用程序,也可以添加到 ContentView。 2)当您将 DetailView 用作您的第一个应用程序视图时,您希望在 DetailView 中具有导航功能,但只是为了“更深入地导航”,并且您不希望在这种情况下能够使用后退按钮返回 ContentView . (请相应地编辑您的问题)
标签: swift navigation swiftui