有关View Controller视图的问题

时间:2011-01-04 07:57:15

标签: objective-c

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

间接地说,View Controller是否可以拥有多个视图属性?

2 个答案:

答案 0 :(得分:6)

donkim是对的但不接受我的话;)

请参阅Rincewind的这篇文章:https://devforums.apple.com/thread/81930以及其他Apple员工在论坛上发表的任何旧评论。

  

如果我理解你是什么   说,你已经创造了另一种观点   controller(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应该有一个单独的根视图(它的'view'属性),它填充窗口,可以处理调整大小以适应状态栏,标签栏等。该控制器可以具有该根视图的任意数量的子视图以及引用这些子视图的属性。


进一步更新在Apple开发人员论坛上考虑“Creating container UIViewController subclasses?”上的这个帖子(讨论设置parentViewController以构建自定义容器视图控制器)。

  

所有UIKit ivars都被视为私有,并且不支持其直接访问,包括通过setValue:forKey:进行访问。设置此ivar的方法也是私有的。

     

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

     

不幸的是,我对替代品没有任何好的建议,但是我们确实认识到创建容器视图控制器的难度。

答案 1 :(得分:0)

根据Jonah在this question中的说法,UIViewController中的视图应该被假定为填满整个屏幕。我已经编写了一些视图UIViewController不会占据整个屏幕的应用程序,它对我来说很有用。

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