2011-07-09 11 views
11

RootViewController de mi ventana es una UINavigationController Entonces .. En RootViewController de este controlador de navegación, que popup una vista modal (un UITabBarController)¿Cómo eliminar la advertencia de "rotación de dos etapas"?

algo como esto:

UIWindow 
->UINavigationController 
-->MyFirstViewController<--In this class I run following code 
[self.navigationController presentModalViewController:tabController animated:YES]; 

Luego de la advertencia depurador: No se admite el uso de la animación de rotación de dos etapas al girar más de un controlador de vista o ver los controladores, no la ventana delegar

Sin embargo, si el mod al vista no es tabController esta advertencia no aparece.

¿Qué hará este comportamiento dañar la aplicación cuando aparezca la vista modal tabController en un controlador de navegación?

O debería encontrar otra manera de hacer esto?

He encontrado varias preguntas similares en este sitio, pero yo no lo entiendo ...

+0

http://stackoverflow.com/questions/576764/tab-bar-controller-inside-a-navigation-controller-or-sharing-a-navigation-root - esta es otra forma de hacerlo. No use el controlador, sino más bien, haga su propio UIControllerView y adjunte una UITabBar a él. El enlace tiene referencia al código fuente (ubicado en GIT). – TamusJRoyce

Respuesta

14

La razón es que está utilizando un UITabBarController fuera del uso previsto de la misma. SÓLO está destinado a ser utilizado como un controlador raíz, y si necesita algo similar a una barra de herramientas de uso tabbar. Estaba teniendo problemas con el problema exacto hace aproximadamente medio año. También te encontrarás con otros problemas si lo usas así, desafortunadamente.

UITabBarController documentation

Porque la clase UITabBarController hereda de la clase UIViewController, los controladores de la barra de pestañas tienen su propia opinión de que es accesible a través de la propiedad vista. Al implementar una interfaz de barra de pestañas , debe instalar esta vista como la raíz de su ventana. A diferencia de otros controladores de vista, una pestaña interfaz de barra nunca debe ser instalada como un dispositivo secundario de otra vista controlador.

+0

respuesta impresionante! Solucionado mi problema –

+0

Dicho esto, he usado un 'UITabBarController' dentro de un' UINavigationController' desde iOS 2 y nunca tuve un problema con eso. – Pascal

+3

¿Cuál sería la forma correcta de hacer una pantalla de inicio de sesión y después de iniciar sesión yendo a un UITabBarController? Exceptuando el mensaje de la consola en ios7, no veo ningún otro problema de uso del controlador dentro de UINavigationController –

2

Tengo una aplicación donde UITabBarController es el controlador de vista raíz. Dependiendo de la compra desde la aplicación, los controles de vista secundarios son diferentes.

En mi NIB, tuve el UITabBarController sin ningún controlador de vista infantil. Agregué los controles de vista secundarios en application:didFinishLaunchingWithOptions:

Esto provocó que apareciera la rotación de advertencia de "dos etapas". Tan pronto como agregué un solo controlador de vista hijo al controlador de tabbar en el NIB, desapareció.

12

Esto también ocurrirá si se agrega sólo un UITabBarController en blanco sin ningún controlador de niño, así:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    //Tab bar controller 
    UITabBarController* tabBarController = [[UITabBarController alloc] init];  
    [[self window] setRootViewController:tabBarController]; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

La advertencia va a desaparecer si se agrega un controlador de vista del niño a la UITabBarController antes de declarar que la RootViewController de su UIWindow.

+0

La causa de esto está muy bien escondida. ¡Bien descrito! Me fijo como esto: 'UIViewController * tempViewController = [[alloc UIViewController] init];' ' UINavigationController * tempNavController = [[alloc UINavigationController] initWithRootViewController: tempViewController];' ' self.tabBarViewController.viewControllers = @ [tempNavController]; ' Ya no recibo la advertencia! Pero está un poco desordenado. – Sam

+0

+1 para "La advertencia desaparecerá si agrega un controlador de vista secundaria al UITabBarController antes de declararlo como el controlador de vista raíz de su UIWindow". – SolidSun

12

Recibí la misma advertencia cuando se subclasificó UITabBarController pero se olvidó de llamar al método viewWillAppear: de la clase base en mi propia clase.

- (void) viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated] // <--- adding this fixed the warning 

    ... 

} 
+2

+1 Gracias - Nunca hubiera pensado en eso causando esta advertencia – anneblue

+0

gracias. tan simple, tan fácil de pasar por alto. Y, de hecho, como dice anneblue, me hubiera tomado mucho tiempo darme cuenta de eso. – Pega88

0

@Maciej Swic me ayudó un poco.

En mi caso ya tenía 2 hijos para el UITabBarController.

Por alguna extraña razón, todo lo que necesito fue poner

[self.window makeKeyAndVisible];

después de haber agregado los 2 hijos.

0

La respuesta de Oliver hizo el truco para mí ... era interesante, sin embargo ... no había tenido ningún problema hasta que agregué un viewWillAppear: método animado al tabviewcontroller subclassed ... en ese punto, todo se volvió loco, hasta que se fijó mediante la adición del [súper viewWillAppear: animado] comunicado Oliver sugiere ...

0

problema tuvo con la advertencia de animación de dos etapas con el siguiente orden:

self.window.rootViewController = self.tabBarController; 
self.tabBarController.selectedIndex = 0; 

Pero cambiar el orden ayúdame a eliminar la advertencia.

self.tabBarController.selectedIndex = 0; 
self.window.rootViewController = self.tabBarController; 

Espero que esto ayude.

Cuestiones relacionadas