【问题标题】:Question on View Controller's view关于 View Controller 视图的问题
【发布时间】:2011-01-04 07:57:14
【问题描述】:

当我们访问 View Controller 的 view 属性时,它总是代表整个屏幕还是部分?

间接来说,一个View Controller可以有多个视图属性吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    donkim 是对的,但不要相信我的话;)

    请参阅 Rincewind 的这篇帖子:https://devforums.apple.com/thread/81930 以及其他 Apple 员工在其论坛上的任何数量的老 cmets。

    如果我了解你是什么 说,你已经创建了另一个视图 控制器(BlueViewController)和 将其视图添加为另一个的子视图 视图控制器?如果是这样,那么这是 文档涵盖 - 特别是 说不要那样做,因为它不是 支持。
    视图控制器是 旨在管理整个屏幕的 价值的内容。如果你想 进一步细分您的内容,然后 建议您使用对象 除了 a 的子类 UIViewController 来管理那些 子区域并管理这些对象 带有 UIViewController 子类。

    此外,我们还有 UIViewController class reference 声明:

    您使用 UIViewController 的每个实例来管理视图层次结构。一个典型的视图层次结构由一个根视图(在此类的视图属性中提供的一个引用)和一个或多个呈现实际内容的子视图组成。在 iPhone 和 iPod touch 上,根视图通常会填满整个屏幕,但在 iPad 上,此视图可能只会填满部分屏幕。在这两种情况下,视图控制器都负责管理整个视图层次结构,包括所有子视图。

    还有View Controller Programming Guide for iOS:

    根视图充当与视图控制器关联的所有其他视图的容器。您通常定义此视图的框架以匹配应用程序窗口的大小,应用程序窗口本身应填满屏幕。但是,视图控制器也会根据需要调整框架大小以适应各种视图的存在,例如系统状态栏、导航栏或选项卡栏。

    不幸的是,没有一个像我想的那样明确为什么 UIViewController 做出这些假设以及何时可以安全地打破它们。据我所知,在没有访问 UIKit 代码的情况下,UIKit 假设单个视图控制器将负责给定屏幕的内容。因此,在某些情况下,如果您在单个窗口中有多个可见的视图控制器,它只会向一个(或可能只有一些)视图控制器发送类似 -viewWillAppear: 或 -didRecieveMemoryWarning 的消息。应该可以通过至少几种不同的方式来证明这一点,尽管我最近没有测试过所有这些,所以我要解决其他用户报告的问题。 嵌套视图控制器不会收到 -didReceiveMemoryWarning 如果在呈现模态视图控制器并且模态视图随后被解除时发生旋转,则多视图控制器的视图将不会旋转。 视图控制器的视图有时会填充窗口并且是不透明的,因此在它们不覆盖的窗口区域中绘制的内容可能是未定义的。尝试呈现一个没有填满屏幕的模态视图控制器不会渲染底层视图,至少在 iOS 3.1.x 或我尝试的最后一个版本中是这样。


    尝试直接回答 hmthur 的问题。 UIViewController 应该有一个根视图(它的“视图”属性),它填充窗口并且可以处理调整大小以适应状态栏、标签栏等。该控制器可能具有该根视图的任意数量的子视图和引用这些子视图的属性。


    作为进一步的更新,请考虑 Apple 开发者论坛上“Creating container UIViewController subclasses?”上的此主题(讨论设置 parentViewController 以构建自定义容器视图控制器)。

    所有 UIKit ivars 都被认为是私有的,不支持直接访问,包括通过 setValue:forKey: 访问。设置这个 ivar 的方法也是私有的。

    至于这个 ivar [parentViewController],我会警告你它的行为可能会改变。

    很遗憾,我对替代方案没有任何好的建议,尽管我们确实认识到创建容器视图控制器的困难。

    【讨论】:

    • 我可能应该补充一点,在 iPad 和 OS 4.2 中,我们看到了对不一定填满窗口的视图控制器的更多支持,因此您现在可能不会遇到那么多问题。不幸的是,Apple 尚未为我们提供一种支持的方式来编写我们自己的容器视图控制器(如 UINavigationController、UITabBarController 或 UISplitViewController),因此嵌套视图控制器仍然很棘手(没有用于设置 parentViewController 的公共 API 为例)。
    • +1 获取所有重要资源。虽然我认为 Apple 员工的第一个不支持你所说的 - 他/她说不要将视图控制器的 view 添加到另一个视图控制器的 view 并且视图控制器的目的是管理整个屏幕的内容,这些内容可能会被视图控制器的view 填充,也可能不会填充(哇,这真是满嘴:)
    • 还有乔纳,我在哪里听说过碳五……?我感觉我最近在新闻里听说过..? :)
    • 我认为声明视图控制器负责整个屏幕表明窗口不应包含视图控制器不拥有的视图,但我同意没有明确说明。我不能说你可能在哪里听说过碳五,但我很高兴你听说过。
    • 不过,您必须询问“不支持”哪些内容。显然可以编写自定义容器 UIViewController 子类,我有一个基于模块化和嵌套 UIViewController 的大型应用程序,因为 UINavigationController 和 UITabbarController 只是没有我的应用程序所需的外观和交互。如果“不支持”意味着“您必须手动传递 Did/Will Appear/Disapper”,那么这没什么大不了的。我发现唯一不起作用的是从非全屏 VC 呈现模态视图控制器,所以我只是从根 vc 呈现。
    【解决方案2】:

    根据this question 中的 Jonah 所说,UIViewController 中的视图应该被假定为填满整个屏幕。我编写的应用程序具有 UIViewController 的视图,而不是占据整个屏幕,这对我来说非常有用。

    对于第二个问题,任何UIView 都可以通过addSubview: 方法添加其他UIViews。所以是的,从某种意义上说,UIViewController 中可以有多个视图(尽管只有一个 view 属性)。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多