繁体   English   中英

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

[英]Should [super loadView] be called from loadView or not?

在 Matt Newburg 的 Programming iOS 4 中,他说:

“要手动为UIViewController提供视图,请实现其loadView方法……您不能调用super ”。

在 Erica Sadun 的 iOS 5 Developer's Cookbook 中,她指出:

loadView方法允许你设置屏幕和布局任何子视图......每当你从一个专门的子类(如UITableViewControllerUITabBarController继承时,请确保调用[super loadView] 。”

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

苹果是事实的来源,他们说没有超级电话。

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

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

[编辑]

散布在 UIViewController 类参考中的另一个重要说明:

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM