iphone - 使用 UIKit View 操作时,整体 View 层次结构如何变化?

标签 iphone uiview uiviewcontroller uiactionsheet uiwindow

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

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

为了弄清楚这一点,我在不同情况下注销了 [[UIApplication sharedApplication] keyWindow] subview 的层次结构。下列说法正确的是:

  1. 当新的 viewController 被插入 UINavigationController 的堆栈时,旧 viewController 的 View 不再位于 View 层次结构中。也就是说,只有顶 View Controller 的 View 是UINavigationController的 View 的 subview (根据日志,它实际上是UILayoutContainerView等几个私有(private)类)。堆栈顶部 Controller 下方的 View Controller 的 View 实际上是否从窗口中删除了?

  2. 当通过 presentModalViewController:animated 呈现新的 viewController 时,会发生非常类似的情况。新的 viewController 的 View 是kew 窗口的唯一 subview 。这是正确的吗?

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

  4. 我遇到的最奇怪的事情:UIActionSheet 通过 showInView: 方法显示,actionSheet 根本不在 View 层次结构中。它不是作为参数传递给 showInView: 的 View 的 subview ,它不会添加为关键窗口的 subview ,并且不会创建自己的窗口。那么它看起来怎么样?

  5. 我还没有尝试过这个,所以我想知道当 UITabBarController 中的选项卡切换时 keyWindow 层次结构中会发生什么。所选 UIViewController 的 View 是否移至顶部,或者是否像 pushViewController:animatedpresentModalViewController: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 层次结构是程序员用来创建这种幻觉的舞台布景/后台。不要混淆两者。

所以:

  1. 堆栈顶部 Controller 下方的 View Controller 的 View 是否实际从窗口中删除?是的。当 View Controller 从堆栈中弹出时,它的 View 就会消失。为什么要浪费内存保存用户可能再也看不到的 View ?
  2. 新的 viewController 的 View 是 kew 窗口的唯一 subview 。这是正确的吗? 是的。
  3. ...UIAlertView 创建自己的窗口并使其成为关键。 是的。
  4. ...actionSheet 根本不在 View 层次结构中。 ...那么它是如何出现的?它是由窗口上方的应用程序添加的。这就是它的特别之处。这也是它能够出现在所有其他 View 之上的原因,即使这些 View 失败了。
  5. 所选 UIViewController 的 View 是否移动到顶部 是。再次,舞台幻觉。您可以将一个 Controller 的 View 替换为另一 Controller 的 View 。

关于iphone - 使用 UIKit View 操作时,整体 View 层次结构如何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473837/

相关文章:

ios - iPhone日期格式中译英

iphone - 在 Objective C 中创建链表

iphone - Apple 的 UIKit 体验与 .net 体验

ios - Spark 检查员

ios - 如何立即替换呈现的 UIViewController?

ios - UIViewController 状态恢复 - 弱关系

iPhone 应用程序产品名称

iphone - 从 nib 加载自定义 UIView,nib 中包含的所有 subview 都是零?

iphone - 如何让底部的那些小 View 出现在 iOS SDK 中?

ios - 从 UIViewController 实例化 UIView 子类