可以调用[super loadView]吗?

时间:2012-03-05 15:57:53

标签: ios uiviewcontroller loadview

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

在loadView(UIViewController Class Reference)的描述中,有人说“你的自定义实现方法不应该调用super。”, 但是在他们提供的ZoomingPDFViewer示例中,loadView实现(ZoomingPDFViewerViewController)正在调用[super loadView]。

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

4 个答案:

答案 0 :(得分:30)

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

如果要以编程方式为视图控制器创建视图层次结构(不使用xib),则覆盖loadView

正如您所指出的,文档明确表明您不应该打电话给超级。

  

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

我认为这是为了避免从xib加载并以编程方式创建视图,因为base使用此方法从xib加载视图:

  

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

另请注意,即使在分配UIViewController对象期间,您为nibNameOrNil参数传递nil,UIViewController loadView实现也会尝试使用关联的类名加载任何xib在它。

  

如果是nibName属性,则视图控制器具有关联的nib文件   返回非零值,如果视图控制器是,则会返回   如果您明确地为它指定了一个笔尖,则从故事板中实例化   使用initWithNibName:bundle:方法,或iOS找到nib的文件   应用程序包中的文件,其名称基于视图控制器   类名。如果视图控制器没有关联的笔尖   file,此方法改为创建一个普通的UIView对象。

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

  

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

就个人而言,如果符合以下情况,我会覆盖loadView:1。)我会为它做的xib非常简单或2.)控件的布局非常动态,因此创建一个静态布局的xib几乎没有益处。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

如果是自定义视图,您可以使用interfaz构建器创建视图,因此您无需调用它。

答案 3 :(得分:0)

如果您以编程方式创建ViewController,则可以在super.loadView()的开头调用self.view = UIView(frame: UIScreen.main.bounds)而不是override func loadView()来构建视图层次结构。但是,您不应致电super.loadView()并同时创建自定义UIViewController.view。 只是不喜欢机器人来解释Apple的文档。