如何知道堆栈中都有哪些视图(或视图控制器)?

Posted

技术标签:

【中文标题】如何知道堆栈中都有哪些视图(或视图控制器)?【英文标题】:How to know which views (or view controllers) are on stack?如何知道堆栈中有哪些视图(或视图控制器)? 【发布时间】:2015-10-30 14:15:06 【问题描述】:

据我所知,当应用程序启动时,第一个视图控制器被加载并呈现他的视图。然后导航到下一个视图控制器,并且前一个视图控制器保留在堆栈中。因此,如果你想返回,你必须关闭当前的视图控制器,以便当前的 VC 被清除出堆栈。

我想检查我对堆栈的看法,因为我的故事板变得有点复杂,并且想确保我做的一切都是正确的。我正在为模态显示的视图以及导航控制器中显示的视图寻找解决方案。

如何检查堆栈中的视图控制器?

我做了一个较长的介绍,因为我不确定我是否使用了适当的术语,我愿意纠正错误。

【问题讨论】:

重复***.com/questions/6498017/… 【参考方案1】:

假设您在最顶层(或任何一个)UIViewController 中,并且您正在使用 UINavigationController(导航栏位于屏幕顶部的那个),那么

self.navigationController.viewControllers 

为您提供堆栈上所有视图控制器的数组。

如果您以模态方式呈现,则需要遍历 self.presentingViewController 及其 presentingViewController 等等,直到 presentingViewController 为 null 并自己创建数组。

但是,不要弄乱视图控制器的堆栈!当您认为这是解决问题的方法时,您很可能走错了路。更好地重新审视您的问题和应用的导航架构。

【讨论】:

我很乐意接受任何反对意见,只要您有理由发表评论即可。我什至可能同意并修改我的答案或删除它。 为什么这个答案被否决了?这是正确的答案。我唯一不同意的是“永远不要修改导航堆栈”;只要当前没有正在进行的推送/弹出动画,这样做是完全安全的(在某些情况下是必要的) 可以肯定的是,到目前为止,赫尔曼已经看到不少人对正确答案投了反对票。你有我的支持来弥补它。 @n00neimp0rtant,你是对的。通过说“不要搞砸......”(不是“永远不要修改”,我只是想警告有人在修改它时很容易搞砸,因为你的故事板似乎变得复杂。这是一个开放的API 或读/写属性,因此很可能会被修改。【参考方案2】:

您可以在 UINavigationControllers 中检查属性 viewControllers。 viewController 是一个 View Controller 数组 - 您可以访问这些元素中的每一个。

 UIViewController *viewController = self.navigationController.viewControllers[i];

【讨论】:

以上是关于如何知道堆栈中都有哪些视图(或视图控制器)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在导航控制器中关闭视图控制器,而不关闭整个堆栈

如何检查视图控制器是不是以模态方式呈现或推送到导航堆栈上?

iOS:如何在视图控制器上制作静态或修复背景

当视图控制器弹出或推入导航控制器堆栈时如何获得通知

如何从堆栈中弹出视图控制器而不导航到它们

在 UINavigationController 堆栈中更新先前视图控制器中的数据的最佳方法