[英]Why should not we call [super loadview] in loadView when creating a custom View controller?
[英]Is it ok to call [super loadView]?
我认为我永远不应该调用 [super loadView] 但有些事情让我感到困惑。
在 loadView ( UIViewController Class Reference ) 的描述中,说“您对该方法的自定义实现不应调用 super。”,但在他们提供的 ZoomingPDFViewer 示例中,loadView 实现 ( ZoomingPDFViewerViewController ) 正在调用 [super loadView]。
我试图从我的 loadView 方法调用它并且它工作正常,但我只是不明白不调用 super 是什么意思。
你绝对不应该调用[super loadView]
。 我想说您在 ZoomingPDFViewer 示例中发现了一个错误。
当您想以编程方式为您的视图控制器(不使用 xib)创建视图层次结构时,您可以覆盖loadView
。
正如您所指出的,文档明确指出您不应调用 super。
此方法的自定义实现不应调用 super。
我认为这是为了避免从 xib 加载和以编程方式创建视图,因为基础使用此方法从 xib 加载视图:
如果视图控制器具有关联的 nib 文件,则此方法从 nib 文件加载视图。
另请注意,即使在分配UIViewController
对象期间,您为 nibNameOrNil 参数传递 nil,该参数的UIViewController
实现loadView
将尝试加载任何带有关联类名称的 xib。
如果 nibName 属性返回非 nil 值,则视图控制器具有关联的 nib 文件,如果视图控制器是从故事板实例化的,如果您使用 initWithNibName:bundle: 方法显式分配给它一个 nib 文件,或者如果 iOS在应用程序包中找到一个名称基于视图控制器类名的 nib 文件。 如果视图控制器没有关联的 nib 文件,则此方法会创建一个普通的 UIView 对象。
此方法的真正目的是让您完全控制构建视图层次结构,而无需依赖内置的 xib 加载机制。:
您可以覆盖此方法以手动创建视图。
就我个人而言,如果出现以下情况,我会覆盖loadView
:1.) 我将为它制作的 xib 非常简单或 2.) 控件的布局非常动态,因此创建具有静态布局的 xib 几乎没有什么好处。
NSViewController 尝试从 -loadView 中的笔尖初始化视图。 由于您的笔尖名称没有为您的控制器设置,它只会给您一个 self.view = nil; 我认为 UIViewController 的工作方式相同。
所以它应该是安全的,但你完全没有必要。
如果您以编程方式创建 ViewController,则可以在override func loadView()
的开头调用super.loadView()
而不是super.loadView()
self.view = UIView(frame: UIScreen.main.bounds)
override func loadView()
。
然而,不叫self.view
前super.loadView()
因为前者会引发后者如果视图没有被加载。
我认为像机器人一样解释 Apple 的文档不是一个好主意。
如果你没有在你的 IB 中创建视图,那么你应该在你的代码中调用 [super loadView] 来为你的程序提供一个视图。
如果是您的自定义视图,您应该使用 interfaz 构建器创建一个视图,因此您不需要调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.