我的SwiftUI应用程序中具有以下结构:
Main container
拥有一个NavigationView
和两个NavigationLinks
,V1
和V4
。
从那里,我可以转到View1
,View2
和View3
,可以使用V1
,V2
和V3
{{1 }}。
我可以使用适当的NavigationLinks
ResultView
,NavigationLinks
,Result1
到Result2
。
我有一个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 container
,false
和View1
}。
我想到了两种可能的解决方案,但每个解决方案都需要注意:
View2
中为View3
隐藏ResultView
:在NavigationLink
中按View 4
时如何防止返回View1、2或3,并且代替ResultView
?Back
之后,使用V4
或Main container
来设置Timer
:似乎是一个骇人听闻的解决方案,但我已经尝试过了,它的作用与不使用它,而且我不想看到来回转换(正好)。对于DispatchQueue.main.asyncAfter
为何行为不正确,或者导航模型更好,您有任何建议吗?
我已经实现了一个解决方案,其中使用了自定义导航堆栈,可以在其中按需弹出并弹出每个屏幕,问题是我失去了一些过渡,我非常想实现通过使用标准V4 = true
。
我在这里留下一个例子。
V1 = false
答案 0 :(得分:0)
不知道这是否仅是Xcode 12功能,但是我找到了一个简单的简单答案,并在最近的答案是https://stackoverflow.com/a/63760934/13293344。
您只需要使用NavigationLink的tag
和selection
并注入一个环境对象来跟踪选择-将环境对象选择设置为nil即可从任何后续子视图中弹出根视图。还可以通过将环境对象选择设置为导航链接的任何标签来转到任何导航链接。