4

我一直试图弄清楚当使用 UITabBarViewController 中的 、 和选项卡开关以及 UIAlertView 和 UIActionSheet 等方法时,视图层次结构中会发生pushViewController:animated什么presentModalViewController:animated

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

为了弄清楚,我一直在注销不同情况下 [[UIApplication sharedApplication] keyWindow] 子视图的层次结构。以下是否正确:

  1. 当一个新的 viewController 被推入 UINavigationController 的堆栈时,旧的 viewController 的视图不再在视图层次结构中。也就是只有top view controller的view是UINavigationController的view的子view(根据日志,其实是UILayoutContainerView等几个私有类)。堆栈顶部控制器下方的视图控制器的视图是否实际上已从窗口中删除?

  2. 当一个新的 viewController 通过presentModalViewController:animated. 新的 viewController 的 view 是kew window 的唯一子视图。这个对吗?

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

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

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

4

3 回答 3

1

我认为您在概念上混淆了视图和视图控制器。导航控制器和标签栏控制器都管理其他视图控制器。两者都不管理视图。

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

视图层次结构是用户看到的舞台错觉。视图控制器层次结构是程序员用来创建这种错觉的舞台设置/后台。不要混淆两者。

所以:

  1. 堆栈顶部控制器下方的视图控制器的视图是否实际上已从窗口中删除?是的。当视图控制器从堆栈中弹出时,它的视图就会消失。为什么要浪费内存来保存用户可能再也看不到的视图?
  2. 新的 viewController 的视图是 kew 窗口的唯一子视图。这个对吗?是的。
  3. ...a UIAlertView 创建自己的窗口并使其成为关键。是的。
  4. ... actionSheet 根本不在视图层次结构中。……那它是怎么出现的呢?它是由窗口上方的应用程序添加的。这就是它的特别之处。即使这些视图失败,它也是能够出现在所有其他视图之上的原因。
  5. 是不是把选中的UIViewController的view移到了顶部是的。再次,舞台幻觉。您将一个控制器视图换成另一个控制器的视图。
于 2010-03-19T12:39:41.303 回答
0

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

– didAddSubview:
– didMoveToSuperview
– didMoveToWindow
– willMoveToSuperview:
– willMoveToWindow:
– willRemoveSubview:
于 2010-03-27T14:45:38.483 回答
0

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

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

于 2010-03-19T02:40:05.473 回答