如何处理深层嵌套的导航链接

时间:2020-05-12 11:09:36

标签: swiftui swiftui-navigationlink

我的SwiftUI应用程序中具有以下结构:

App structure

Main container拥有一个NavigationView和两个NavigationLinksV1V4。 从那里,我可以转到View1View2View3,可以使用V1V2V3 {{1 }}。

我可以使用适当的NavigationLinks ResultViewNavigationLinksResult1Result2

我有一个Result3,其中包含EnvironmentObject的{​​{1}}属性的所有bool标志。

当我到达ResultView时,需要弹出视图并转到V4,直到以后才能访问V1,V2和V3。

问题是发生了以下恶作剧(在iPhone 8,iOS 13.4.1上):

  • 如果我设置了isActive然后设置了NavigationLinks,则V1 = false的行为很奇怪,它会弹出到以前的视图(View1,View2或View3),然后转到View4,然后回到MainContainer。
  • 如果我仅设置V4 = true,它将正确弹出至NavigationView

我需要将V2,V3,Result1,Result2和Result3设置回V1 = false,以确保可以从V1重新启动然后再转到V2,依此类推。 另外,我的应用程序的要求之一是,在转到{{1}之后,我不能绝对回到回到Main containerfalseView1 }。

我想到了两种可能的解决方案,但每个解决方案都需要注意:

  1. View2中为View3隐藏ResultView:在NavigationLink中按View 4时如何防止返回View1、2或3,并且代替ResultView
  2. 在设置Back之后,使用V4Main container来设置Timer:似乎是一个骇人听闻的解决方案,但我已经尝试过了,它的作用与不使用它,而且我不想看到来回转换(正好)。

对于DispatchQueue.main.asyncAfter为何行为不正确,或者导航模型更好,您有任何建议吗?

我已经实现了一个解决方案,其中使用了自定义导航堆栈,可以在其中按需弹出并弹出每个屏幕,问题是我失去了一些过渡,我非常想实现通过使用标准V4 = true

我在这里留下一个例子。

V1 = false

1 个答案:

答案 0 :(得分:0)

不知道这是否仅是Xcode 12功能,但是我找到了一个简单的简单答案,并在最近的答案是https://stackoverflow.com/a/63760934/13293344

您只需要使用NavigationLink的tagselection并注入一个环境对象来跟踪选择-将环境对象选择设置为nil即可从任何后续子视图中弹出根视图。还可以通过将环境对象选择设置为导航链接的任何标签来转到任何导航链接。