我一直在试图弄清楚当使用诸如 pushViewController:animated
、presentModalViewController:animated
和 UITabBarViewController 中的选项卡开关等方法时, View 层次结构中会发生什么,以及 UIAlertView 和 UIActionSheet。
(旁注:我这样做是因为当我不知道我创建的特定 UIView 或其 super View 如何添加到 View 层次结构中时,我需要知道它是否在屏幕上可见。如果有人知道确定这一点的好方法,我欢迎您的知识。)
为了弄清楚这一点,我在不同情况下注销了 [[UIApplication sharedApplication] keyWindow] subview 的层次结构。下列说法正确的是:
当新的 viewController 被插入 UINavigationController 的堆栈时,旧 viewController 的 View 不再位于 View 层次结构中。也就是说,只有顶 View Controller 的 View 是UINavigationController的 View 的 subview (根据日志,它实际上是UILayoutContainerView等几个私有(private)类)。堆栈顶部 Controller 下方的 View Controller 的 View 实际上是否从窗口中删除了?
当通过
presentModalViewController:animated
呈现新的 viewController 时,会发生非常类似的情况。新的 viewController 的 View 是kew 窗口的唯一 subview 。这是正确的吗?最容易理解的事情:UIAlertView 创建自己的窗口并使其成为关键。
我遇到的最奇怪的事情:UIActionSheet 通过
showInView:
方法显示,actionSheet 根本不在 View 层次结构中。它不是作为参数传递给showInView:
的 View 的 subview ,它不会添加为关键窗口的 subview ,并且不会创建自己的窗口。那么它看起来怎么样?我还没有尝试过这个,所以我想知道当 UITabBarController 中的选项卡切换时 keyWindow 层次结构中会发生什么。所选 UIViewController 的 View 是否移至顶部,或者是否像
pushViewController:animated
和presentModalViewController:animated
一样工作,其中只有显示的 View 位于窗口层次结构中?
最佳答案
我认为您在概念上混淆了 View 和 View Controller 。导航 Controller 和标签栏 Controller 都管理其他 View Controller 。两者都不管理 View 。
整个应用程序没有 View 层次结构,只有 View Controller 的层次结构。仅当加载每个受控 View 时, View 层次结构才存在。然后你就有了一个 window-->viewController.view-->viewController.view.subviews 的临时层次结构。当您在堆栈上推送/弹出另一个 View Controller 时,您将获得另一个 View 层次结构。
View 层次结构是用户看到的舞台幻觉。 View Controller 层次结构是程序员用来创建这种幻觉的舞台布景/后台。不要混淆两者。
所以:
- 堆栈顶部 Controller 下方的 View Controller 的 View 是否实际从窗口中删除?是的。当 View Controller 从堆栈中弹出时,它的 View 就会消失。为什么要浪费内存保存用户可能再也看不到的 View ?
- 新的 viewController 的 View 是 kew 窗口的唯一 subview 。这是正确的吗? 是的。
- ...UIAlertView 创建自己的窗口并使其成为关键。 是的。
- ...actionSheet 根本不在 View 层次结构中。 ...那么它是如何出现的?它是由窗口上方的应用程序添加的。这就是它的特别之处。这也是它能够出现在所有其他 View 之上的原因,即使这些 View 失败了。
- 所选 UIViewController 的 View 是否移动到顶部 是。再次,舞台幻觉。您可以将一个 Controller 的 View 替换为另一 Controller 的 View 。
关于iphone - 使用 UIKit View 操作时,整体 View 层次结构如何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473837/