Можно ли назвать [super loadView]? - PullRequest
25 голосов
/ 05 марта 2012

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

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

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

Ответы [ 4 ]

30 голосов
/ 05 марта 2012

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

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

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

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

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

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

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

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

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

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

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

1 голос
/ 05 марта 2012

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

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

0 голосов
/ 26 июля 2017

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

0 голосов
/ 05 марта 2012

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

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

...