Ответ 1
Я собираюсь пойти дальше и не согласиться с @St3fan и использовать UIKit
в качестве контр-примера.
Однако мудрость (или ее отсутствие) встроенных контроллеров в целом должна основываться на нормальных принципах дизайна пользовательского интерфейса.
Самый простой встречный пример - UINavigationControllers
, встроенный в UITabBarControllers
. Они появляются повсюду. Сверху от головы, приложение iPod на iPhone и контакты в приложении Phone на iPhone.
Мне было любопытно узнать, что они делают с представлениями (добавить к представлению "суперконтроллер" или к UIWindow
. Я был уверен, что я собираюсь найти, что представления подконтроллеров были потомки представлений суперконтроллера в иерархии представлений, что противоречит рекомендации St3fan.
Я взломал очень быстрое приложение для iPhone, подключая все в интерфейсе InterfaceBuilder для создания приложения на основе UITabBarController
с двумя вкладками, первым из которых был UINavigationController
с простым ole UIViewController
в качестве контроллера корневого представления, и вторую вкладку с простым старым UIViewController
, так что у меня была вторая вкладка, чтобы щелкнуть позже.
Посыпьте несколько операторов NSLog
для вывода различных UIView's
для контроллеров, которые мы видим:
tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ...
navigationController.view = <UILayoutContainerView: 0x59469a0; ...
rootViewController.view = <UIView: 0x594bb70; ...
Superview: <UIViewControllerWrapperView: 0x594cc90; ...
Superview: <UINavigationTransitionView: 0x594a420; ...
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view
Superview: <UIViewControllerWrapperView: 0x594b430; ...
Superview: <UITransitionView: 0x5b0e110; ...
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view
Superview: <UIWindow: 0x5942a30; ...
Линии, предваряемые "Superview", были результатом перехода вверх по цепочке супервизора rootViewController.view's
, пока не достигнут нулевой.
Затем, конечно, быстро взгляните на стек вызовов в нескольких местах, где viewDidDisappear
будет вызван в контроллер корневого представления.
Во-первых, стек вызовов, когда viewDidDisappear
вызывается в корневом контроллере в результате перехода нового контроллера в стек:
-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...
Во-вторых, стек вызовов, когда другая вкладка выбрана в самом верхнем UITabBarController:
-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
Поэтому во всех случаях кажется, что Apple решила, что контроллеры должны вызывать различные методы viewDidAppear
и т.д. на своих встроенных субконтроллерах и что представление должно быть встроено аналогично. Я думаю, что OP поражает этот гвоздь прямо на голове, если мы хотим принять UIKit
дизайн как хорошее руководство для последующего.