是否应该从loadView调用[super loadView]?

时间:2012-02-02 00:21:57

标签: ios

在Matt Newburg的iOS 4编程中,他指出: “要手动提供带有视图的UIViewController,请实现其loadView方法......您不能调用super”。

在Erica Sadun的iOS 5 Developer's Cookbook中,她说: “loadView方法允许你设置屏幕并布局任何子视图....每当你从UITableViewController或UITabBarController等专门的子类继承时,一定要调用[super loadView]。”

对我来说,这至少令人困惑。

2 个答案:

答案 0 :(得分:4)

Apple是真相的来源,他们说没有超级电话。

  

如果您覆盖此方法以手动创建视图,   您应该这样做并将层次结构的根视图分配给   查看属性。 (您创建的视图应该是唯一的实例和   不应与任何其他视图控制器对象共享。)   这种方法的自定义实现不应该调用super。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

[编辑]

另一个重要的注释散布在UIViewController类的引用中:

  

默认的loadView方法尝试从笔尖加载视图   与视图控制器关联的文件(如果有)。

答案 1 :(得分:1)

这是一个非常古老的问题,但我发现它需要一个比它得到的更好的答案。

<块引用>

是否应该从 loadView 调用 [super loadView]

视情况而定。您引用的两个来源是在讨论不同的情况,并且在所描述的上下文中它们都是正确的。

来自 Neuberg 的引用是在谈论直接从 UIViewController 继承的视图控制器。该类有自己的 loadView 实现,提供默认行为;具体来说,它会自动从与视图控制器关联的 .xib(或故事板)文件加载视图层次结构。如果您调用该方法的 UIViewController 版本,则在该方法中创建的视图层次结构将替换您自己实现的视图层次结构,反之亦然。在提出这个问题九年后,the documentation for UIViewController's -loadView method 仍然警告不要这样做:

<块引用>

您可以重写此方法以手动创建视图。如果您选择这样做,请将视图层次结构的根视图分配给视图属性。您创建的视图应该是唯一的实例,不应与任何其他视图控制器对象共享。 此方法的自定义实现不应调用 super。 [强调]

来自 Sadun 的引用是在谈论一种不同的情况,即您的视图控制器不是 UIViewController 的直接子类,而是派生自 UITableViewControllerUITabBarController 等。这些类会覆盖 -loadView 本身并需要调用它们的版本。至少在 UITableViewController 的情况下,这在 Overview 部分中被调用:

<块引用>

您可以覆盖 loadView 或任何其他超类方法,但如果您这样做了,请务必调用该方法的超类实现,通常是作为第一个方法调用。

因此,如果您子类化 UIViewController 并提供您自己的 -loadView 实现来生成控制器的视图,而不是使用 .xib 或故事板来提供视图,请不要调用超类的 { {1}} 方法。另一方面,如果您对 -loadView 等类进行子类化并执行相同的操作,请查看文档以查看是否需要从您自己的覆盖中调用该类的 UITableView 方法。