2

即使我们不像其他 ViewController 生命周期方法那样在视图控制器中覆盖它,是否也会调用 loadView?即使我们不覆盖 ViewDidLoad 方法,我们也知道这个生命周期方法将被 ios 内部调用。LoadView 也会发生同样的事情吗?还是仅在 VC 中的视图为 nil 或我们显式覆盖它时才调用它?

4

2 回答 2

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()仍然是进行任何额外初始化的绝佳场所。

有几件事要记住:

  1. 仅分配给您的视图loadView()。不要调用它(在右侧;不要调用它的 getter),因为这会导致无限循环。如果view为 nil,则loadView调用创建它。
  2. 不要打电话super.loadView()。此方法旨在将视图分配给您的视图属性。通过调用 super,您将执行此操作两次。

有关您可能陷入的无限循环陷阱的更多信息:

从 UIViewController 的角度来看

如果您访问此属性并且其值当前为 nil,则视图控制器会自动调用 loadView() 方法并返回结果视图。

viewloadView()当它为 nil 时被创建并赋值。如果你在它自己内部这样做loadView,你会提示loadView在它自己的身体内被召唤。

于 2020-04-09T00:49:14.087 回答
1

是的,它仍然会被调用。您将观察到与将其添加到视图控制器相同的行为。

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() 
}
于 2020-04-09T00:45:07.000 回答