Подтвердить что ты не робот

Можно ли назвать [super loadView]?

Я думал, что я никогда не должен называть [super loadView], но что-то меня пугает.

В описании loadView (Справочник класса UIViewController) говорится, что "ваша пользовательская реализация этого метода не должна быть вызвана супер". но в примере ZoomingPDFViewer, который они дали, реализация loadView (ZoomingPDFViewerViewController) вызывает [super loadView].

Я попытался вызвать его из моего метода loadView, и он работает нормально, но я просто не понимаю, что значит не называть супер.

4b9b3361

Ответ 1

Вы определенно не должны звонить [super loadView]. Я бы сказал, что вы обнаружили ошибку в примере ZoomingPDFViewer.

Вы переопределяете loadView, если хотите программно создать иерархию представлений для своего контроллера представления (не используя xib).

Как вы указали, в документах четко указано, что вы не должны называть super.

Ваша пользовательская реализация этого метода не должна быть вызвана супер.

Я предполагаю, что это следует избегать загрузки как из xib, так и с программным созданием представления, поскольку этот метод используется базой для загрузки представления из xib:

Если контроллер представления имеет связанный файл nib, этот метод загружает представление из файла nib.

Обратите внимание, что даже если при распределении вашего объекта UIViewController вы передаете nil для параметра nibNameOrNil, реализация UIViewController loadView будет пытаться загрузить любой xib с соответствующим именем класса в нем.

Контроллер вида имеет связанный файл nib, если свойство nibName возвращает значение non-nil, которое возникает, если контроллер вида был созданный из раскадровки, если вы явно назначили ему нить файл с использованием метода initWithNibName: bundle: method, или если iOS найдет нить файл в комплекте приложений с именем на основе контроллеров представления имя класса. Если в контроллере представления нет связанного ниба файл, этот метод создает простой объект UIView.

Настоящая цель этого метода - дать вам полный контроль над построением иерархии представлений, не полагаясь на встроенный механизм загрузки xib.:

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

Лично я переопределяю loadView, если: 1.) xib, который я бы сделал для него, действительно тривиальным или 2.) Макет элемента управления очень динамичен, поэтому создание xib со статическим макетом имеет мало преимуществ.

Ответ 2

NSViewController пытается инициализировать представление из nib в -loadView. Поскольку ваше имя низа не установлено для вашего контроллера, оно просто даст вам self.view = nil; Я бы предположил, что UIViewController работает одинаково.

Так что это должно быть безопасно, но вам это совершенно не нужно.

Ответ 3

Если у вас нет представления, созданного в вашем IB, вы должны вызвать [super loadView] в своем коде, чтобы просмотреть вашу программу.

В случае ваших пользовательских представлений вы должны создать представление с помощью построителя межфаз, поэтому вам не нужно его вызывать.

Ответ 4

Если вы создаете свой ViewController программно, вы можете вызвать super.loadView() вместо self.view = UIView(frame: UIScreen.main.bounds) в начале override func loadView(), чтобы создать свой иерархический вид. Однако вы не должны вызывать super.loadView() и одновременно создавать свой собственный UIViewController.view. Просто не нравится, когда робот объясняет документацию Apple.