如果当前视图控制器被呈现并推送,如何展开到正确的视图控制器?

Posted

技术标签:

【中文标题】如果当前视图控制器被呈现并推送,如何展开到正确的视图控制器?【英文标题】:How to unwind to the right view controller if current one is presented AND pushed? 【发布时间】:2018-02-03 19:12:24 【问题描述】:

我有一个视图控制器,比如说 A,它由其他三个视图控制器访问,比如说 B、C 和 D。

B 以模态方式呈现UIViewController A。

C 和 D 是 UINavigationController 的一部分,因此推送视图控制器 A。

如果他们都有模态序列,我可以做一个switch(presentingViewController) 来确定谁是我应该unwind 的视图控制器。问题是,由于其中两个位于导航堆栈(B 和 C)中,它们永远不会是 presentingViewController

我该如何解决这个难题?

【问题讨论】:

您使用的是故事板和转场吗?如果是这样,那么您需要做的就是在每个视图控制器中实现相同的展开方法名称,展开转场将在运行时确定它需要去哪里;见developer.apple.com/library/content/technotes/tn2298/… 【参考方案1】:

检查A 中是否存在导航控制器。如果是,你会pop,如果不是,你会dismiss

【讨论】:

我需要做一些自定义逻辑,具体取决于我要放松到哪一个。因此,仅弹出/关闭是不够的 听起来A 做得太多了。你可以让一个委托在AviewWillDisappear 上触发BCD 听。不知道你的整个逻辑很难说。 你认为这个答案 (***.com/questions/13898324/…) 的委托模式会更好还是你的? 在所有父控制器的 prepareSegue 函数中编写相同的代码是多余的。代表在这里听起来像是一个更好的解决方案。如果在这两种情况下都只需要一行,我认为这并不重要。

以上是关于如果当前视图控制器被呈现并推送,如何展开到正确的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

将 NavigationController 添加到当前视图

将 segue 展开到尚未呈现的视图控制器?

如何从呈现的视图控制器上的按钮操作推送视图控制器

如何在一种情况下推送视图控制器,但在另一种情况下以模态方式呈现它?

当每个新的视图控制器被推送时,调整导航控制器的大小以模态 UIModalPresentationFormSheet 呈现

在推送视图控制器上使用当前方向