【问题标题】:SwiftUI - Navigating back to home without nesting?SwiftUI - 在没有嵌套的情况下导航回家?
【发布时间】:2020-09-28 11:28:13
【问题描述】:

在下面的代码中,如果我使用链接在视图 A 和 B 之间来回切换,我最终会得到如图所示的嵌套视图。我发现避免嵌套的唯一方法是永远不要链接到声明 NavigationView 的视图 - 就像在下面的 ViewA 中一样。我的问题...有没有办法在没有视图嵌套的情况下返回 ViewA?

struct ViewA: View {
   var body: some View {
      NavigationView{
        NavigationLink(destination: ViewB()) {
           Text("ViewB")
        }
      }
      .navigationBarTitle("ViewA")
   }
}

struct ViewB: View {
   var body: some View {
       NavigationLink(destination: ViewA()) {
          Text("ViewA")
       }
      .navigationBarTitle("ViewB")
   }
}

【问题讨论】:

    标签: swiftui swiftui-navigationlink


    【解决方案1】:

    你不应该创建NavigationLink(destination: ViewA()),因为它没有返回它创建一个新的 ViewA。导航到 ViewB 后,将自动为您创建返回按钮。

    struct ViewA: View {
       var body: some View {
          NavigationView{
            NavigationLink(destination: ViewB()) {
               Text("ViewB")
            }
          }
          .navigationBarTitle("ViewA")
       }
    }
    
    struct ViewB: View {
       var body: some View {
          Text("ViewB Pure Content")
             .navigationBarTitle("ViewB")
       }
    }
    

    【讨论】:

    • 这是有道理的。我的示例尽可能简单,但实际上,我可能希望从视图 C 或 D 回到视图 A。也许我可以传递对 ViewA 的引用...
    • 不,你必须关闭 isDetailLink 标志。见这里例如stackoverflow.com/questions/64051976/…
    • 感谢您的帮助。不幸的是,关闭 isDetail 标志并不能解决我上面的简单示例。
    • 您上面的示例无效,但我对此的解释似乎不够清楚。
    • 你是对的。我已经为此工作了很长一段时间。我现在知道我正在创造新的观点。我不知道我是怎么忽略的,但谢谢你。问题是,与过去使用 popToRoot 完成的解决方案相比,我遇到的每个解决方案都显得过于复杂。我只是在寻找两个视图之间的最短距离,似乎没有一个好的答案。
    【解决方案2】:

    您正在嵌套视图,因为每次单击 ViewA/ViewB 时都会创建一个新的视图对象。你可以添加

    @Environment(\.presentationMode) var presentationMode 并打电话 presentationMode.wrappedValue.dismiss()

    当视图按钮被按下时,你关闭它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多