За кулисами происходит очень многое с Представление какао и управление ViewController .
1.Объект viewController
По своей сути, viewController является универсальным объектом контроллера.Когда он впервые выделяется инициализированным, он не имеет объекта представления, связанного с ним.Представление создается только тогда, когда (и если) оно требуется.Таким образом, без учета представления жизненный цикл viewController такой же, как и у любого другого объекта:
UIViewController * myVC = [[UIViewController alloc] initWith...];
...
[myVC release];
Назначенный инициализатор для viewControllers - -initWithNibname:bundle:
.Если вы укажете перо, viewController может автоматически загрузить свое представление из этого кончика и подключить любые IBOutlets, которые вы определили (более подробно см. Ниже).
2.Загрузка и выгрузка представления
ViewController загрузит его представление по мере необходимости.Это обычно происходит, когда метод -view
вызывается впервые, и может произойти в любой момент в вашей программе, в зависимости от того, как вы инициализируете свой пользовательский интерфейс.Представление также может быть уничтожено и перезагружено несколько раз в течение жизни вашей программы, даже в зависимости от того, как вы управляете своим пользовательским интерфейсом.Когда viewController определил, что его представление требуется, но еще не загружено, будет вызван метод -loadView
.Основной поток сообщений выглядит примерно так:
view
loadView
viewDidLoad
Обратите внимание, что если вы переопределите метод -view
, -loadView
и viewDidLoad
не будут вызываться автоматически.Если вы переопределите -loadView
, вы должны установить свойство view
viewController.В противном случае следующий вызов -view
снова запустит процесс загрузки.
Представление также может быть выгружено в любое время в течение жизненного цикла вашей программы, просто установив для свойства view
значение nil
.Реализация по умолчанию -didReceiveMemoryWarning
сделает это автоматически, если представление не имеет суперпредставления (т.е. если оно не является частью иерархии активного представления).Поток сообщений выглядит следующим образом:
view = nil
viewDidUnload
2a.Загрузка представления программным способом
Если вы решите переопределить -loadView
, вы можете создавать представления, подпредставления, другие viewControllers и любые соединения между этими объектами любым удобным для вас способом.Конечно, это означает, что вы также несете ответственность за управление памятью в отношении объектов, которые вы создаете.Если ваш подкласс переопределяет -loadView
, он должен быть инициализирован с использованием nil
для nibName
и bundle
.
2b.Загрузка представления из пера
Если вы используете файл пера, реализация по умолчанию -loadView
автоматически откроет этот файл пера, создаст экземпляры его объектов, добавит любые соединения между ними и позаботится оуправление памятью для вас.
С nib-файлами дела обстоят немного сложнее, поскольку за кулисами происходит так много всего.Метод -awakeFromNib
вызывается для каждого объекта , который создается при загрузке файла пера, и нет никакой гарантии, что другие объекты в файле пера будут полностью загружены при его вызове.
3.Отображение представлений
-viewWillAppear:
, -viewDidAppear:
, -viewWillDisappear:
и -viewDidDisappear:
вызывается только тогда, когда представление отображается или скрывается на экране, особенно во время анимированных переходов из одного вида в другой.,Эти методы могут вызываться много раз в течение жизненного цикла вашей программы, так как представления меняются местами в вашей схеме навигации.
4.Посмотреть макет
Метод -layoutSubviews
является , а не частью UIViewController
.Он вызывается для UIView
объектов, когда их границы были изменены.Если в вашей программе используется пользовательский подкласс UIView
, этот метод можно использовать для создания пользовательского макета подпредставления вместо использования стандартных методов автоматического изменения размера Cocoa.
5.Собираем все вместе
Из-за сложности есть много разных способов для этого процесса, но нормальная временная шкала может выглядеть примерно так:
-[viewController initWithNibname:Bundle:]
-[viewController awakeFromNib]
-[viewController loadView]
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear] // user navigated away
-[viewController viewDidDisappear]
...
-[viewController viewWillAppear] // user navigated back
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear] // user navigated away
-[viewController viewDidDisappear]
...
-[viewController setView:nil] // memory warning, perhaps
-[viewController viewDidUnload]
...
-[viewController loadView] // user navigated back
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...