即使我们不像其他 ViewController 生命周期方法那样在视图控制器中覆盖它,是否也会调用 loadView?即使我们不覆盖 ViewDidLoad 方法,我们也知道这个生命周期方法将被 ios 内部调用。LoadView 也会发生同样的事情吗?还是仅在 VC 中的视图为 nil 或我们显式覆盖它时才调用它?
2 回答
它总是被调用。从文档中,
视图控制器在其视图属性被请求但当前为 nil 时调用此方法。此方法加载或创建视图并将其分配给视图属性。
如果视图控制器具有关联的 nib 文件,则此方法从 nib 文件加载视图。如果 nibName 属性返回非 nil 值,则视图控制器具有关联的 nib 文件,如果视图控制器是从情节提要中实例化的,如果您使用 init(nibName:bundle:) 方法显式为其分配了一个 nib 文件,则会发生这种情况,或者如果 iOS 在应用程序包中找到一个名称基于视图控制器的类名的 nib 文件。如果视图控制器没有关联的 nib 文件,则此方法将创建一个普通的 UIView 对象。
...
您可以覆盖此方法以手动创建视图。如果您选择这样做,请将视图层次结构的根视图分配给视图属性。您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。此方法的自定义实现不应调用 super。
即使您不覆盖它,它也会被调用。通常,只有当您不想从其 nib 创建视图控制器时,您才会覆盖它。在这种方法中,您将分配self.view
一些值(因为view
延迟加载)。如果您没有为您的视图属性分配一些特殊的子类,您通常可以通过将所有逻辑添加到viewDidLoad()
.
这是一个示例实现:
// Say you have some custom view you want use as your controller's view
class CustomView: UIView { ... }
...
// In your view controller, you can set that custom instance to your view property.
override func loadView() {
self.view = CustomView()
}
UITableViewController
,例如,UITableView
在此方法中将 a 设置为您的视图(大概)。
默认情况下,视图只是一个普通的 UIView。如果这就是您所需要的,那么根本没有理由调用此方法。 viewDidLoad()
仍然是进行任何额外初始化的绝佳场所。
有几件事要记住:
- 仅分配给您的视图
loadView()
。不要调用它(在右侧;不要调用它的 getter),因为这会导致无限循环。如果view
为 nil,则loadView
调用创建它。 - 不要打电话
super.loadView()
。此方法旨在将视图分配给您的视图属性。通过调用 super,您将执行此操作两次。
有关您可能陷入的无限循环陷阱的更多信息:
从 UIViewController 的角度来看:
如果您访问此属性并且其值当前为 nil,则视图控制器会自动调用 loadView() 方法并返回结果视图。
view
loadView()
当它为 nil 时被创建并赋值。如果你在它自己内部这样做loadView
,你会提示loadView
在它自己的身体内被召唤。
是的,它仍然会被调用。您将观察到与将其添加到视图控制器相同的行为。
override func loadView() {
// Only call this to observe this is being called.
// If you want to write your own implementation, you shouldn't call super.loadView().
// Instead, create your own UIView instance and set self.view = yourView.
super.loadView()
}