使用多个导航控制器关闭多个模式视图
Posted
技术标签:
【中文标题】使用多个导航控制器关闭多个模式视图【英文标题】:Dismiss multiple modal views with several navigation controllers 【发布时间】:2015-10-29 10:22:38 【问题描述】:试着跟着我看下面的图片。 ViewController A 以模态方式推送 navController A,依次通过 ViewController F 显示 ViewController A 作为 show segues。这样做的原因是我需要一个UINavigationBar
以便在不同的UIViewControllers
之间来回切换。但是在这条交互线的某一点上,您实际上可以向上推另一条导航交互线,从 ViewController B 到 navController B。它们最终都会以 ViewController F 结束,但数据略有不同。当我到达 ViewController F 并且我已经完成了那个 UIViewController
时,我想立即返回到 ViewController A,而不会看到多个关闭动画。 p>
为此,我使用了各种不同的代码行,但最终都遇到了相同的问题。我可以让他们很好地解雇他们,所以我最终选择了 ViewController A。但是,当我使用 navController B 使用交互线时,它会为 ViewController F 的解除设置动画,但仍然会有 ViewController F在那次解雇之后,当动画完成时它会闪烁,我最终到达 ViewController A。基本上看起来在我要解散的那个后面还有另一个 ViewController F,但没有(我已经在 Xcode 中检查了 3D 视图)。
我似乎无法修复它。我尝试删除 navController B 并且它工作正常,我只看到 1 个动画并最终在 ViewController A 没有上面解释的问题,但我必须有那个 navController B 那里。简而言之,在模态视图中使用多个 UINavigationControllers
似乎存在问题。
关闭代码:ViewControllerA.dismissViewControllerAnimated(true, completion: nil)
【问题讨论】:
【参考方案1】:我会尽量避免在模态视图上呈现模态视图。考虑将 View Controller G 从 View Controller B 推送到相同的导航流,而不是模态地呈现它。这将允许您始终只关闭 NavController A 的一个导航流。
【讨论】:
是的,根据我们的设计师的说法,目前这不是一个选择。所以我不得不解决这个问题。【参考方案2】:我最终要做的是检查 ViewController F 处的 PresentingViewController
是否为 ViewController A,因为如果您通过 ViewController G 则 PresentingViewController
将是 ViewController B。 而在 ViewController F 中,我首先关闭了没有动画的前端模式演示,然后关闭了第二个带有动画的演示。看起来不错。
if let _ = presentingViewController as? ViewControllerA
view.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil)
else
dismissViewControllerAnimated(false, completion: nil)
view.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil)
view.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil)
将开始消除来自 rootViewController
的所有模式。仅在 else
子句中添加两个 dismissViewControllerAnimated()
是行不通的。
【讨论】:
以上是关于使用多个导航控制器关闭多个模式视图的主要内容,如果未能解决你的问题,请参考以下文章