performSegueWithIdentifier 和 popViewControllerAnimated 破屏导航

Posted

技术标签:

【中文标题】performSegueWithIdentifier 和 popViewControllerAnimated 破屏导航【英文标题】:performSegueWithIdentifier and popViewControllerAnimated breaking screen navigation 【发布时间】:2013-09-20 12:13:52 【问题描述】:

我有 4 个 ViewController A、B、C、D。我使用从 Storyboard 创建的 Push Segues 从 A->B->C->D 移动。

由于我的应用程序的逻辑,如果用户想从屏幕 D 返回,屏幕 C 不再有效,我使用 performSegueWithIdentifier 将用户重定向到屏幕 C

问题从现在开始 - 我无法使用 [self.navigationController popViewControllerAnimated:YES]; 从屏幕 B->A 移回

我想知道为什么会发生这种情况,我该如何解决这种情况并修复导航?

【问题讨论】:

这种情况正在发生,因为您使用的是模态转场,而不是从 D 弹出到 B。这不会产生预期的结果。最有可能的是,它只是创建了 B 的另一个实例,并将其作为模式视图控制器呈现在一切之上。看我的回答。 【参考方案1】:

您使用的 segue 类型是什么?

你为什么不使用:

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

您可以使用UINavigationControllerviewControllers 属性访问视图控制器堆栈。

这里是Apple's documentation on UINavigationController

【讨论】:

对于正常的向前屏幕导航,我使用从 Storyboard 创建的Push Segue。为了从 D->B 移回,我通过将 ViewController D 连接到 ViewController B(使用水平翻转)创建了一个 Modal Segue,并给它起了一个我在 performSegueWithIdentifier 中使用的名称 你不应该像你那样混合导航控制器和模态segues。试试我建议的方法。 我能知道你为什么说这个不能混吗? 是的,你可以。当你呈现一个模态视图控制器时,你实际上是在逃避当前的导航树/结构。一个很好的例子是当您将其用作用户指南屏幕或展示某些内容并在完成后将其关闭时。您的用例完全不同。您需要做的就是从导航堆栈中弹出 2 个视图控制器,而不是一个。我建议你研究一下UINavigationController导航和Modal View Controller导航之间的区别。

以上是关于performSegueWithIdentifier 和 popViewControllerAnimated 破屏导航的主要内容,如果未能解决你的问题,请参考以下文章

performSegueWithIdentifier 出现运行时错误,为啥?

iOS8 performSegueWithIdentifier 运行太慢

performSegueWithIdentifier:sender: 找不到我的转场

unwind segue / performSegueWithIdentifier: 问题

performSegueWithIdentifier 不起作用

performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图