voy a seguir adelante y estar de acuerdo con @ St3fan, y utilizar UIKit
como el ejemplo contrario.
Sin embargo, la sabiduría (o la falta de ella) de los controladores de inclusión en general debe guiarse por principios de diseño de IU.
El contraejemplo más fácil es UINavigationControllers
incrustado en UITabBarControllers
. Estos aparecen por todo el lugar. Justo en la parte superior de mi cabeza, la aplicación iPod en iPhone, y Contactos dentro de la aplicación Teléfono en iPhone.
yo era lo suficientemente curioso que molestarse en comprobar lo que hacen con los puntos de vista (añadir a la vista "super-controlador" o al UIWindow
. Estaba bastante seguro de que iba a encontrar que los puntos de vista sub-controlador eran descendientes de las vistas de supercontrolador en la jerarquía de vista, lo cual es contrario a la recomendación de St3fan.
Arranqué una aplicación de iPhone muy rápida conectando todo en InterfaceBuilder para crear una aplicación basada en UITabBarController
con dos pestañas, la primera de las cuales era un UINavigationController
con un simple ole UIViewController
como su controlador de vista raíz, y una segunda pestaña con un simple viejo UIViewController
solo para que tuviera una segunda pestaña para hacer clic más adelante.
Espolvorear en algunos NSLog
declaraciones a la salida los diversos UIView's
para los controladores que vemos esto:
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; ...
Las líneas con el prefijo "Superview" eran la salida desde recorriendo la cadena de rootViewController.view's
supervista hasta golpear nula.
Luego, por supuesto, un vistazo rápido a la pila de llamadas en un par de lugares donde se llamaría viewDidDisappear
en el controlador de vista raíz.
En primer lugar, la pila de llamadas cuando viewDidDisappear
se llama en el controlador de la raíz como resultado de un nuevo controlador de ser empujado en la pila:
-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...
En segundo lugar, la pila de llamadas cuando otra pestaña se selecciona en el de más arriba UITabBarController:
-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
lo tanto, en todos los casos, parece que Apple ha decidido que los controladores deben estar llamando los distintos viewDidAppear
, métodos, etc en sus sub-controladores embebidos y que de la vista deben insertarse similares ly. Creo que el OP golpeó este clavo justo en la cabeza si tomamos el diseño UIKit
como una buena pista para seguir.
solo porque tengo curiosidad ...: ¿por qué envolver un controlador de barra de pestañas en otro controlador de vista? :) en la mayoría de los casos, son la raíz de la jerarquía de la vista (controlador) ... – Toastor
+1 .. realmente resolvió mi problema .. aplausos –