繁体   English   中英

即使我们不像其他 ViewController 生命周期方法那样在 viewcontroller 中覆盖它,是否也会调用 loadView?

[英]does loadView get called even if we don't override it in viewcontroller like the other ViewController lifecycle methods?

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

它总是被调用。 文档中,

视图 controller 在其视图属性被请求但当前为 nil 时调用此方法。 此方法加载或创建视图并将其分配给视图属性。

如果视图 controller 具有关联的 nib 文件,则此方法从 nib 文件加载视图。 A view controller has an associated nib file if the nibName property returns a non-nil value, which occurs if the view controller was instantiated from a storyboard, if you explicitly assigned it a nib file using the init(nibName:bundle:) method,或者如果 iOS 在应用程序包中找到一个 nib 文件,其名称基于视图控制器的 class 名称。 如果视图 controller 没有关联的 nib 文件,则此方法将创建一个普通的 UIView object 代替。

...

您可以覆盖此方法以手动创建视图。 如果您选择这样做,请将视图层次结构的根视图分配给视图属性。 您创建的视图应该是唯一的实例,并且不应与任何其他视图 controller object 共享。 此方法的自定义实现不应调用 super。

即使您不覆盖它,它也会被调用。 通常,仅当您不想从其 nib 创建视图 controller 时才会覆盖它。 在此方法中,您将为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设置为您的视图(大概)。

默认情况下,视图只是一个普通的 UIView。 如果这就是您所需要的,那么根本没有理由调用此方法。 viewDidLoad()仍然是进行任何额外初始化的绝佳场所。

有几件事要记住:

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

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

从 UIViewController 的角度来看

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

view为 nil 时,在loadView()中创建并分配视图。 如果您在loadView本身中执行此操作,您将提示loadView在其自身的主体中被调用。

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

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() 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM