iOS:如果不使用UINavigationController,以编程方式查看导航堆栈中的视图控制器?

时间:2015-07-02 20:08:46

标签: ios xcode uinavigationcontroller storyboard

是否可以查看导航堆栈中的哪些视图控制器? Swift和iOS的新手,只是想确保导航正常进行,并且视图控制器不会无意中堆叠。

为了澄清,您似乎可以在viewControllers中使用UINavigationController属性,但出于学习目的,我们不会使用导航控制器并执行通过退出segues手动导航。

如果不使用UINavigationController

,是否可以以编程方式打印出视图控制器层次结构

2 个答案:

答案 0 :(得分:4)

  

是否可以查看哪些视图控制器位于导航堆栈中?...如果不使用UINavigationController,是否可以以编程方式打印视图层次结构?

你在谈论两件完全不同的事情。视图和视图控制器不是同一种对象。它们都倾向于在像自己这样的对象的有向图中使用,但是这两种对象的图形是完全不同的。也就是说,导航控制器是一种视图控制器,它保存其他视图控制器的列表,并且(单独地)视图保持它包含的视图的数组。最后,大多数视图控制器管理通常包含其他视图的单个视图。

查看视图层次结构的简单方法是在一个视图控制器的某行上设置断点,并使用调试器po [self.view recursiveDescription],它将打印(在调试器中)视图的描述和视图控制器管理的子视图。

更简单的方法是使用Xcode的漂亮视图调试器,它为您提供了一个可以在3D中检查的分层视图:

layered view inspector

该检查器的图标看起来像一个矩形在另一个上面:

debug image hierarchy

您当然可以打印出您的代码可以访问的任何对象图表,但是从您的评论中可以看出,您必须编写一个方法来执行此操作。如果您没有使用导航控制器,则没有“导航堆栈”可以打印出来。当然,您可以实现自己的导航堆栈版本,但是由您来提供检查它的方法。

答案 1 :(得分:3)

UINavigationController将其视图控制器保存在end module属性中,该属性是一个数组。您可以检查该值以查看导航堆栈。

您还可以使用Xcode的视图层次结构调试器以3D形式直观地查看应用中的所有视图。

另一种选择是使用Facebook Chisel's navigationController.viewControllers命令打印视图控制器层次结构。