27

我认为我永远不应该调用 [super loadView] 但有些事情让我感到困惑。

在 loadView (UIViewController Class Reference)的描述中,据说“您对此方法的自定义实现不应调用 super。”,但在他们给出的 ZoomingPDFViewer 示例中,loadView 实现(ZoomingPDFViewerViewController)正在调用 [super loadView]。

我试图从我的 loadView 方法中调用它并且它工作正常,但我只是不明白不调用 super 是什么意思。

4

4 回答 4

32

你绝对不应该打电话[super loadView]。我想说您在 ZoomingPDFViewer 示例中发现了一个错误。

loadView当您想以编程方式为您的视图控制器创建视图层次结构(不使用 xib)时,您会覆盖。

正如您所指出的,文档明确指出您不应调用 super。

此方法的自定义实现不应调用 super。

我假设这是为了避免从 xib 加载和以编程方式创建视图,因为基础使用此方法从 xib 加载视图:

如果视图控制器具有关联的 nib 文件,则此方法从 nib 文件加载视图。

还要注意,即使在分配UIViewController对象期间,您将 nil 传递给 nibNameOrNil 参数,该参数的UIViewController实现loadView将尝试加载其中具有关联类名的任何 xib。

如果 nibName 属性返回非 nil 值,则视图控制器具有关联的 nib 文件,如果视图控制器是从情节提要中实例化的,如果您使用 initWithNibName:bundle: 方法显式为其分配了一个 nib 文件,或者如果 iOS在应用程序包中找到一个 nib 文件,其名称基于视图控制器的类名。如果视图控制器没有关联的 nib 文件,则此方法将创建一个普通的 UIView 对象。

此方法的真正目的是让您完全控制构建视图层次结构,而无需依赖内置的 xib 加载机制。:

您可以覆盖此方法以手动创建视图。

就个人而言,loadView如果出现以下情况,我会覆盖: 1.) 我将为它制作的 xib 真的很微不足道或 2.) 控件的布局是非常动态的,因此创建具有静态布局的 xib 几乎没有什么好处。

于 2012-03-05T16:05:10.970 回答
1

NSViewController 尝试从 -loadView 中的 nib 初始化视图。由于您的笔尖名称没有为您的控制器设置,它只会给您一个 self.view = nil; 我会假设 UIViewController 的工作方式相同。

所以它应该是安全的,但你完全没有必要。

于 2012-03-05T16:09:18.653 回答
0

如果您没有在 IB 中创建视图,那么您应该在代码中调用 [super loadView] 来为您的程序提供视图。

在您的自定义视图的情况下,您应该使用 interfaz 构建器创建一个视图,因此您不需要调用它。

于 2012-03-05T16:04:31.840 回答
0

如果您以编程方式创建 ViewController,则可以调用super.loadView()而不是self.view = UIView(frame: UIScreen.main.bounds)override func loadView().

但是,不要调用self.viewbefore super.loadView(),因为如果未加载视图,前者将触发后者。

我认为将 Apple 的文档解释为机器人不是一个好主意。

于 2017-07-26T12:38:38.473 回答