我认为我永远不应该调用[super loadView],但有些东西让我感到困惑。
在loadView(UIViewController Class Reference)的描述中,有人说“你的自定义实现方法不应该调用super。”, 但是在他们提供的ZoomingPDFViewer示例中,loadView实现(ZoomingPDFViewerViewController)正在调用[super loadView]。
我试过从我的loadView方法调用它并且它工作正常,但我只是不明白那么不能调用super是什么意思。
答案 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的文档。