“为了手动为
UIViewController
提供视图,请实现其loadView
方法...你绝不能调用super
。”在Erica Sadun的《iOS 5 Developer's Cookbook》中,她提到:
“
loadView
方法允许您设置屏幕并布局任何子视图...确保在继承自特殊子类(如UITableViewController
或UITabBarController
)时调用[super loadView]
。”对我来说,至少这是令人困惑的。
UIViewController
提供视图,请实现其loadView
方法...你绝不能调用super
。”loadView
方法允许您设置屏幕并布局任何子视图...确保在继承自特殊子类(如UITableViewController
或UITabBarController
)时调用[super loadView]
。”苹果公司是真相的源头,他们说不使用super call。
如果您为了手动创建视图而覆盖此方法,则应该这样做并将您的层次结构的根视图分配给view属性。(您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。)您对此方法的自定义实现不应调用super。
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
[编辑]
UIViewController类文档中还散布着另一个重要说明:
默认的loadView方法尝试从与视图控制器相关联的nib文件加载视图(如果有)。
这是一个很老的问题,但我发现它需要比原来更好的答案。
[super loadView]
应该从loadView
中调用吗?
这取决于情况。 你引用的两个来源讨论的是不同的情况,在它们描述的上下文中都是正确的。
Neuberg 的引用是关于直接从 UIViewController
继承的视图控制器。该类有其自己的 loadView
实现,提供默认行为;具体来说,它会自动从与视图控制器相关联的 .xib(或 storyboard)文件中加载视图层次结构。如果您调用 UIViewController
版本的该方法,则在该方法中创建的视图层次结构将替换您自己实现的视图层次结构,反之亦然。九年后, UIViewController
的 -loadView
方法的文档 仍然警告不要这样做:
因此,如果您正在子类化UIViewController
并提供自己的-loadView
实现来生成控制器的视图,而不是使用.xib或storyboard提供视图,请不要调用超类的-loadView
方法。另一方面,如果您正在子类化诸如UITableView
之类的类,并做同样的事情,请查看文档以确定是否需要从您自己的覆盖中调用该类的-loadView
方法。