关闭模态视图控制器
Posted
技术标签:
【中文标题】关闭模态视图控制器【英文标题】:dismiss modal ViewControllers 【发布时间】:2014-09-07 20:55:26 【问题描述】:我有一系列嵌套的导航控制器(因为我希望导航栏位于顶部,如果不使用导航控制器,我无法让该栏看起来正确)。
所以基本上它看起来像这样: -NavigationController-VC1-->(Modal)--NavigationController-VC2-->(modal)...等
当我在摘要 ViewController 中时,最后一个 - 我想要一个按钮将用户带回最根 ViewController。我该怎么做?
我尝试了 popToRootViewControllerAnimated 但这不起作用,因为我有一系列导航控制器(更好的解决方案??)
谢谢!
编辑
现在导航:
导航控制器 --> VC1 --(modal)-->VC2 --(modal)-->VC3...等等
【问题讨论】:
【参考方案1】:你没有说你是否使用故事板,但如果你正在尝试寻找放松的segues。 What are Unwind segues for and how do you use them?
使用 unwind segue 应该可以让你回到你需要在层次结构中的位置。
【讨论】:
抱歉,我正在使用故事板 您应该能够使用展开转场功能返回到层次结构中的任何位置。 我使用了你的方法,效果很好。我还添加了一个 prepareForSegue 方法来保存代码;)谢谢!【参考方案2】:popToRootViewController:Animated
只会返回到导航控制器的视图控制器数组中的[0]
。所以换句话说,第一个导航控制器的根总是VC1,而你的第二个导航控制器的根总是VC2。您应该重新考虑您的应用程序的结构,因为您不应该将一个导航控制器推送到另一个 - 这没有任何意义。您可以执行以下操作:
Navigation Controller -> VC1 -> (push segue) -> VC2 -> (push segue) -> VC3
这样popToRootViewController:Animated
将返回VC1。
我会使用多个导航控制器的唯一原因是如果我有某种表格,其中包含以下选项:
---
A Navigation Controller -> VCA1 -> (push segue) -> VCA2 -> (push segue) -> VCA3
---
B Navigation Controller -> VCB1 -> (push segue) -> VCB2 -> (push segue) -> VCB3
---
C Navigation Controller -> VCC1 -> (push segue) -> VCC2 -> (push segue) -> VCC3
---
即使在这种情况下,根视图控制器也始终是 VCA1、VCB1 或 VCC1。
希望这会有所帮助。
如果您发布您想要完成的内容也会有所帮助,以便我们更好地理解您的问题。
【讨论】:
我这样做的原因是因为我有导航按钮的顶部栏太大如果我添加了一个空提示,但太小如果我没有。 NavigationController 让它变得非常大。我将尝试重新构建我的应用程序以使其更有条理;)这里的概念有点像一个向导,添加一个新项目并在此过程中向该项目添加内容。它将用于工作的东西 @Erik,哦,好吧,酷。请记住,如果您不想处理导航控制器的额外复杂性,您可以子类化元素以使它们看起来像您想要的那样。您还提到它是一个向导,您将“添加”提示等。在我看来,所有场景都应该已经加载,并且不应该在此过程中动态生成。 是的。谢谢!;) - 我先睡一会儿,明天继续,这里迟到了 我现在尝试了 popToRootViewController:Animated,但没有任何反应。我认为代码在触发后被称为 NSLog ,但它不会忽略任何内容。有任何想法吗? @Carpetfizz 我用 pidge 的回答解决了这个问题,虽然我想用 popToRootViewController:animated 来解决这个问题。这是 ViewControllers 的截图:imgur.com/y2A1GaM@Carpetfizz【参考方案3】:通过编写第一行,您可以获得所有视图控制器的索引,从第二行开始,您将到达目的地。
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];
【讨论】:
我现在试过了,但绝对没有发生任何事情:/ - 在 popToViewController 之后做了一个 NSLog 并且它确实记录了,但它不会弹出到视图控制器。任何想法为什么?请参阅我更新的问题,了解导航现在的外观【参考方案4】:如果你对所有视图控制器使用相同的导航控制器,那么这条线对你来说很好。
[self.navigationController popToRootViewControllerAnimated:YES];
但在您的情况下,您正在展示模型视图控制器。对于这种情况,您需要在展示另一个模型视图控制器之前关闭第一个模型视图控制器。
【讨论】:
我可以使用这种方法,但是用户将无法在“向导”中倒退以上是关于关闭模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章