Во-первых, не существует реализации по умолчанию loadView
... этот метод специально для вас, чтобы переопределить.Я согласен, что документы Apple могут быть немного неясными, хотя.Но loadView
вызывается по умолчанию всякий раз, когда к представлению контроллера навигации обращаются, и представление не существует (например: UIView *view = viewController.view
).Его также можно вызвать вручную.Но ни в одной ситуации loadView
не будет иметь правильных размеров ... что на самом деле невозможно.loadView
вызывается для того, чтобы родительский контроллер представления получил представление в первую очередь, чтобы он мог соответствующим образом изменить его размер.Затем, как только он получает представление, он вызывает viewDidLoad
.Это единственный путь кода, который они могут использовать, потому что представления могут загружаться из метода loadView
или пера, и они должны предоставлять место для дополнительной настройки, когда представления загружаются из пера.Наконец, родительский контроллер изменит размер представления и вызовет viewWillAppear
только тогда, когда представление действительно появится.Например, если вы поместите контроллер на navController, который находится за пределами экрана, он не будет вызывать viewWillAppear
, пока сам navController не появится на экране.Это сделано потому, что нет смысла запускать этот код, пока контроллер не станет видимым.По этой же причине вы можете получить правильный размер только в методе viewWillAppear
.
Теперь вы заметили, что если вы добавляете контроллер к стандартному контроллеру, ничего такого не происходит.Это связано с тем, что контроллеры представления на самом деле не должны содержать других контроллеров представления.Теперь в iOS 5 они явно поддерживают использование Контейнеров Контроллера Представления ... который по существу является контроллером представления, который разработан, чтобы содержать другие контроллеры представления.Они добавили несколько удобных методов в iOS 5, чтобы помочь с этим, но это не является строго необходимым.Суть всего этого такова: если вы хотите добавить один контроллер представления в другой, вам придется вручную настроить все соответствующие вызовы дочернего контроллера представления (все методы загрузки, события вращения, предупреждение о памяти и т. Д.).Другими словами, вы должны сделать свой собственный контроллер представления контейнера.Однако, когда вы это сделаете, помните, что я говорил ранее о пути кода.Важно, чтобы вы вызывали дочерние методы контроллера в том же порядке, что и Apple, иначе все будет работать неправильно.
Вот несколько ссылок на информацию: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html - Прокрутите вниз до: Реализация контроллера представления контейнера.
Также здесь для жизненного цикла контроллера представления, который поможет вам выяснить, какие вызовы должны быть сделаны в каком порядке: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10-SW1
Я рекомендую прочитать полное Руководство по программированию View Controller.... оттуда вы можете получить много информации: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457-CH1-SW1