/ / El uso de setViewController de UINavigationController en iPhone no se comporta correctamente: object-c, uinavigationcontroller, pushviewcontroller

El uso de setViewController desde UINavigationController en iPhone no se comporta correctamente - object-c, uinavigationcontroller, pushviewcontroller

Tengo un problema con una aplicación de iPhone que usaUINavigationController. Cuando estoy usando pushNavigationController, funciona bien. El iPhone hace su animación mientras cambia al siguiente ViewController. Pero cuando usa una serie de ViewControllers y el método setViewControllers, tiene una falla en la animación que puede convertirse en una animación claramente visible. insecto.

El siguiente fragmento de código se llama en la raízViewController. Dependiendo de la condición, debería cambiar a ViewController1 o directamente a ViewController2. En este último caso, el usuario puede navegar de nuevo a vc1, luego a la raíz.

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2];
// put us on the stack
[viewControllers addObject:self];
// add first VC
AuthentificationViewController* authentificationViewController =
[[[AuthentificationViewController alloc] initWithNibName:@"AuthentificationViewController" bundle:nil] autorelease];
[viewControllers addObject:authentificationViewController];

if (someCondition == YES)
{
UserAssignmentsListViewController* userAssignmentsListViewController =
[[[UserAssignmentsListViewController alloc] initWithNibName:@"UserAssignmentsOverviewViewController" bundle:nil] autorelease];

[viewControllers addObject:userAssignmentsListViewController];
}

[self.navigationController
setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES];

Como pueden ver, agregaré la primera y tal vez lasegundo VC a la matriz, finalmente configurando la pila de navigationController con animación. Esto funciona correctamente si solo agrego el primer controlador. Pero en el caso de que la animación deba ir al segundo controlador, el título de la barra de navegación "t" no estará "volando". En su lugar, hay un título vacío hasta que se termina la animación. Y, lo que es peor, si sustituyo el título de la barra de navegación con un botón personalizado, este botón se mostrará en la esquina superior izquierda hasta que la animación haya finalizado. Eso es bastante un error de visualización.

Traté de usar una solución con múltiplesMétodos de pushViewController, pero la animación no se ve o se siente bien. Quiero que la navegación haga su animación de la misma manera que pushViewController. La única diferencia aquí es que no agrego un VC sino que configuro toda la pila en una vez. ¿Hay alguna otra solución aquí, o podría considerarse como un error del marco? Pensé en usar solo pushNavController para VC2, luego de alguna manera inserte VC1 en la pila, pero eso no parece posible.

Gracias por todos los consejos y sugerencias. :-)

Datos técnicos: Estoy usando iOS 4.2, compilando para 4.0.

Respuestas

5 para la respuesta № 1

Finalmente encontré la solución. El error fue que el nuevo NavigationController de nivel superior no se ha inicializado y cargado correctamente hasta que se realiza la animación. En mi caso, UserAssignmentsListViewController tiene un viewDidLoad Método que no se llamará hasta que se complete la animación, pero establece el título de navegación (aquí: un UIButton). Por lo tanto la animación falla.

La solución es referirse a un controlador de vista ya inicializado cuando se trata de empujarlo hacia la pila. Así que inicialice nuestro VC de alto nivel en algún lugar:

// initialize our top-level controller
ViewController* viewController2 = [[[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil] autorelease];

Luego, al insertar dos o más VC en la pila, el nivel superior uno ya está inicializado y la animación funciona (siguiendo el ejemplo de mi pregunta original):

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2];
// put us on the stack, too
[viewControllers addObject:self];

ViewController* viewController1 = [[[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil] autorelease];
[viewControllers addObject:viewController1];

if (someCondition == YES)
{
[viewControllers addObject:viewController2];
}

[self.navigationController
setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES];