我想我永远不应该调用[super-loadView],但有些事情让我困惑。
在loadView(UIViewController类引用)的描述中,有人说"这个方法的自定义实现不应该调用super。",但在他们给出的ZoomingPDFViewer示例中,loadView实现(ZoomingPDF ViewerViewController)正在调用[super-loadView]。
我试着从loadView方法调用它,它运行良好,但我只是不明白不调用super意味着什么。
您绝对不应该调用[super loadView]
。我认为您在ZoomingPDFViewer示例中发现了一个错误。
如果要以程序方式为视图控制器创建视图层次结构(不使用xib),则可以覆盖loadView
。
正如您所指出的,docs清楚地声明您不应该调用super。
此方法的自定义实现不应调用super。
我认为这是为了避免从xib加载和用程序创建视图,因为这个方法是由基础用来从xib:加载视图的
如果视图控制器具有关联的nib文件,则此方法加载nib文件中的视图。
还要注意,即使在分配UIViewController
对象的过程中,您为nibNameOrNil参数传递nil,loadView
的UIViewController
实现也会尝试加载任何带有相关类名的xib。
如果nibName属性为返回一个非零值,如果视图控制器从故事板实例化,如果您显式地为其分配了笔尖使用initWithNibName:bundle:方法的文件,,或者如果iOS找到了nib应用程序捆绑包中具有基于视图控制器的名称的文件类名如果视图控制器没有关联的笔尖文件,此方法将创建一个普通的UIView对象。
这种方法的真正目的是让您完全控制构建视图层次结构,而不依赖于内置的xib加载机制
您可以替代此方法,以便手动创建视图。
就我个人而言,如果以下情况,我会覆盖loadView
:1.)我为其创建的xib非常琐碎或2.)控件的布局非常动态,因此创建具有静态布局的xib几乎没有好处。
NSViewController尝试从-loadView中的一个nib初始化视图。由于你的笔名没有为你的控制器设置,它只会给你一个self.view=nil;我认为UIViewController的工作方式是一样的。
所以它应该是安全的,但你完全没有必要。
如果您的IB中没有创建视图,那么您应该在代码中调用[super-loadView]来为程序提供视图。
在自定义视图的情况下,假设您使用interfaz生成器创建一个视图,因此不需要调用它。
如果以编程方式创建ViewController,则可以在override func loadView()
开头调用super.loadView()
而不是self.view = UIView(frame: UIScreen.main.bounds)
。
但是,不要在super.loadView()
之前调用self.view
,因为如果未加载视图,前者将触发后者。
我不认为像机器人一样解释苹果的文档是个好主意。