使用UIKit视图操作时,整体视图层次结构如何变化?

时间:2010-03-18 22:40:08

标签: iphone uiview uiviewcontroller uiactionsheet uiwindow

我一直在试图弄清楚在使用UITabBarViewController中的pushViewController:animatedpresentModalViewController:animated和制表符开关等方法时视图层次结构中发生了什么,以及UIAlertView和UIActionSheet。

(旁注:我这样做是因为我需要知道我的创作的特定UIView是否在屏幕上可见,而我不知道它或它的超级视图如何被添加到视图层次结构中。有人知道确定这一点的好方法,我欢迎这些知识。)

为了解决这个问题,我一直在不同情况下注销[[UIApplication sharedApplication] keyWindow]子视图的层次结构。以下是正确的:

  1. 当一个新的viewController被推到UINavigationController的堆栈上时,旧的viewController的视图不再在视图层次结构中。也就是说,只有顶视图控制器的视图是UINavigationController视图的子视图(根据日志,它实际上是几个私有类,如UILayoutContainerView)。实际上是从窗口中移除了堆栈顶部控制器下方的视图控制器的视图吗?

  2. 当通过presentModalViewController:animated呈现新的viewController时,会发生非常类似的事情。新的viewController视图是 kew窗口的唯一子视图。这是对的吗?

  3. 最容易理解的事情是:UIAlertView创建自己的窗口并使其成为关键。

  4. 我遇到的最奇怪的事情是:通过showInView:方法显示UIActionSheet,actionSheet 根本不在视图层次结构中。它不是作为showInView:的参数传递的视图的子视图,它不会作为键窗口的子视图添加,也不会创建自己的窗口。那怎么样呢?

  5. 我还没有尝试过这个,所以我想知道当切换UITabBarController中的选项卡时keyWindow层次结构会发生什么。所选UIViewController的视图是移动到顶部,还是像pushViewController:animatedpresentModalViewController:animated一样工作,其中只显示的视图位于窗口层次结构中?

3 个答案:

答案 0 :(得分:1)

我认为你在概念上混淆了视图和视图控制器。导航控制器和tabbar控制器管理器都是其他视图控制器。既不管理观点。

整个应用程序没有视图层次结构,只有视图控制器的层次结构。仅在加载每个受控视图时才存在视图层次结构。然后你有一个临时的窗口层次结构 - > viewController.view - > viewController.view.subviews。当您在堆栈上推送/弹出另一个视图控制器时,您将获得另一个视图层次结构。

视图层次结构是用户看到的舞台错觉。视图控制器层次结构是程序员用于创建该幻觉的阶段集/后台。不要混淆两者。

所以:

  1. 堆栈顶层控制器下方的视图控制器视图是否实际从窗口中删除了?是。当视图控制器从堆栈弹出时,其视图消失。为什么浪费内存持有用户可能永远不会再看到的视图?
  2. 新的viewController视图是kew窗口的唯一子视图。这是对的吗?是的。
  3. ... UIAlertView创建自己的窗口并将其设为关键。是。
  4. ... actionSheet根本不在视图层次结构中。 ...那么它是如何出现的?它是由窗口上方的应用程序添加的。这就是它的特殊之处。即使这些视图失败,它也能够出现在所有其他视图之上。
  5. 是否将所选UIViewController的视图移至顶部是。再次,阶段错觉。您将一个控制器视图换出另一个控制器的视图。

答案 1 :(得分:0)

我现在为UITabBarViewController执行了相同类型的日志记录,因此,考虑到第5部分:

它似乎与UINavigationController的工作方式相同:只有与当前活动选项卡关联的视图控制器的视图位于keyWindow的视图层次结构中。

答案 2 :(得分:0)

UIView上的以下方法可以满足您的需求:

– didAddSubview:
– didMoveToSuperview
– didMoveToWindow
– willMoveToSuperview:
– willMoveToWindow:
– willRemoveSubview: