Я собираюсь пойти дальше и не согласиться с @ St3fan и использовать UIKit
в качестве контрпримера.
Однако мудрость (или ее отсутствие)Встраиваемые контроллеры в целом должны руководствоваться разумными принципами проектирования пользовательского интерфейса.
Самый простой контрпример - это UINavigationControllers
, встроенный в UITabBarControllers
.Они появляются повсюду.Прямо у меня на голове, приложение iPod на iPhone и контакты в приложении Phone на iPhone.
Мне было любопытно проверить, что они делают с представлениями (добавьте в «суперконтроллера "или к UIWindow
. Я был почти уверен, что собираюсь обнаружить, что представления субконтроллера были потомками представлений суперконтроллера в иерархии представлений, что противоречит рекомендации St3fan.
Я запустил очень быстрое приложение для iPhone, подключив все в InterfaceBuilder, чтобы создать приложение на основе UITabBarController
с двумя вкладками, первой из которых была UINavigationController
с простым ole UIViewController
в качестве корневого контроллера и2-я вкладка с простым старым UIViewController
, поэтому у меня была 2-я вкладка, чтобы щелкнуть позже.
Посыпать некоторыми операторами 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» были результатом перехода по цепочке 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
и т. Д. На своих встроенных субконтроллерах и что представления должны быть встроены аналогичным образом.Я думаю, что ОП ударил по этому гвоздю прямо в голову, если бы мы взяли UIKit
дизайн как хороший пример для подражания.