loadView方法中应该调用[super loadView]吗?

9
在Matt Newburg的《Programming iOS 4》中,他提到:
“为了手动为UIViewController提供视图,请实现其loadView方法...你绝不能调用super。”
在Erica Sadun的《iOS 5 Developer's Cookbook》中,她提到:
loadView方法允许您设置屏幕并布局任何子视图...确保在继承自特殊子类(如UITableViewControllerUITabBarController)时调用[super loadView]。”
对我来说,至少这是令人困惑的。
2个回答

4

苹果公司是真相的源头,他们说不使用super call。

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

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

[编辑]

UIViewController类文档中还散布着另一个重要说明:

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


哎呀,由于某种原因,我以为他们没有明确说明。 - Jack Lawrence
我有一个关于这个的简短问题。我有AppDelegate并将其rootView设置为另一个UIViewController类实例(在其中我修改loadView中的视图)。如果我不调用[super loadView],则该方法会被调用三次。如果我调用它,一切都完美。那么我是否在Apple的文档中漏掉了什么?如果我不允许执行[super loadView],那么如果我不从nib加载视图,我应该在哪里设置我的视图? - andi1984
如果我将UINavigationController设置为AppDelegate的rootViewController,并再次将UIViewController推到navcontroller堆栈中,一切都很完美。因此,我不明白为什么会出现这些差异。 - andi1984
但是,他们对这个相当令人困惑的指导方针的理由是什么? - Norswap

2

这是一个很老的问题,但我发现它需要比原来更好的答案。

[super loadView] 应该从 loadView 中调用吗?

这取决于情况。 你引用的两个来源讨论的是不同的情况,在它们描述的上下文中都是正确的。

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

你可以重写这个方法来手动创建视图。如果你选择这样做,请将你的视图层次结构的根视图分配给视图属性。你创建的视图应该是唯一的实例,不应与任何其他视图控制器对象共享。你自定义实现此方法时不应调用super。Sadun的引用谈到了一个不同的情况,即你的视图控制器不是UIViewController的直接子类,而是派生自UITableViewController、UITabBarController等。那些类重写了-loadView方法并需要调用它们的版本。至少在UITableViewController的情况下,在概述部分中有说明。你可以重写loadView或任何其他超类方法,但如果你这样做,请确保调用该方法的超类实现,通常作为第一个方法调用。

因此,如果您正在子类化UIViewController并提供自己的-loadView实现来生成控制器的视图,而不是使用.xib或storyboard提供视图,请不要调用超类的-loadView方法。另一方面,如果您正在子类化诸如UITableView之类的类,并做同样的事情,请查看文档以确定是否需要从您自己的覆盖中调用该类的-loadView方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接