вызывается loadView, даже если мы не переопределяем его в viewcontroller, как другие методы жизненного цикла ViewController? - PullRequest
2 голосов
/ 09 апреля 2020

Вызывается ли loadView, даже если мы не переопределяем его в контроллере представления, как другие методы жизненного цикла ViewController? Даже если мы не переопределим метод ViewDidLoad, мы знаем, что этот метод жизненного цикла будет вызываться изнутри ios. То же самое происходит и с LoadView? или он вызывается только когда представление внутри V C равно нулю или когда мы явно переопределяем его?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Это всегда вызывается. Из документации ,

Контроллер представления вызывает этот метод, когда запрашивается его свойство представления, но в данный момент оно равно nil. Этот метод загружает или создает представление и назначает его свойству view.

Если у контроллера представления есть связанный файл пера, этот метод загружает представление из файла пера. Контроллер представления имеет связанный файл пера, если свойство nibName возвращает ненулевое значение, что происходит, если контроллер представления был создан из раскадровки, если вы явно назначили ему файл пера, используя метод init (nibName: bundle :), или если iOS находит файл пера в комплекте приложений с именем, основанным на имени класса контроллера представления. Если у контроллера представления нет связанного файла пера, этот метод вместо этого создает простой объект UIView.

...

Вы можете переопределить этот метод, чтобы создать свои взгляды вручную. Если вы решите сделать это, назначьте root представление вашей иерархии представлений свойству представления. Представления, которые вы создаете, должны быть уникальными экземплярами и не должны использоваться совместно с любым другим объектом контроллера представления. Ваша пользовательская реализация этого метода не должна вызывать super.

Он вызывается, даже если вы не переопределяете его. Как правило, вы можете переопределить его, только если вы не хотите создавать контроллер представления из его кончика. В этом методе вы бы присваивали self.view некоторое значение (поскольку view загружается лениво). Если вы не назначаете какой-то особый подкласс для своего свойства представления, вы обычно можете получить, добавив все свои логи c к 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(). Не вызывайте его (с правой стороны; не вызывайте его геттер), потому что это может вызвать бесконечное l oop. Если view равно нулю, для его создания вызывается loadView.
  2. Не звоните super.loadView(). Этот метод предназначен для присвоения вида свойству вида. Позвонив по телефону super, вы сделаете это дважды.

Немного больше информации о бесконечной ловушке l oop, в которую вы можете попасть:

Из представления UIViewController :

Если вы обращаетесь к этому свойству и его значение в настоящий момент равно nil, контроллер представления автоматически вызывает метод loadView () и возвращает получившееся представление.

view создается и назначается в loadView() когда ноль. Если вы сделаете это внутри самого loadView, вы предложите вызвать loadView в своем собственном теле.

1 голос
/ 09 апреля 2020

Да, он все еще будет вызываться. Вы будете наблюдать то же поведение, что и при добавлении этого в контроллер представления.

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