Pregunta

Estoy teniendo un problema con el uso de un UINavigationController iPhone App. Cuando estoy usando pushNavigationController, funciona bien. El iPhone hace su animación mientras se cambia a la siguiente ViewController. Pero cuando se utiliza una matriz de ViewControllers y el método setViewControllers, tiene un problema técnico en la animación que puede crecer en un insecto animación claramente visible.

El siguiente fragmento se denomina en el ViewController raíz. Dependiendo de una condición que debe cambiar, ya sea a ViewController1, o se debe ir directamente a ViewController2. En este último caso, el usuario puede navegar de vuelta a VC1, a continuación, 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 se puede ver que voy a añadir la primera y tal vez la segunda VC a la matriz, finalmente, el establecimiento de la pila navigationController con la animación. Esto funciona correctamente si sólo añadir el primer controlador. Pero en el caso de que la animación debe ir al segundo controlador, el título de la barra de navegación no será "volando en". En cambio, hay un título vacío hasta que se termine la animación. Y, lo que es peor, si se sustituye la barra de navegación del título con un botón personalizado, este botón se mostrará en la esquina superior izquierda hasta que termine la animación. Eso es un error de visualización.

He intentado utilizar una solución con múltiples métodos pushViewController, pero la animación no se ve / se siente bien. Quiero que la navegación para hacer su animación de la misma manera como lo hace pushViewController. La única diferencia en este caso es, que no añado un VC, pero puse toda la pila a la vez. ¿Hay alguna otra solución aquí, o esto podría ser considerado como el insecto de un marco? Pensé en usar solamente pushNavController para VC2, entonces de alguna manera inserción VC1 en la pila, pero eso no parece posible.

Gracias por todas las sugerencias y consejos. : -)

Datos técnicos:. Estoy usando iOS 4.2, la compilación de 4.0

¿Fue útil?

Solución

Finalmente he encontrado la solución. El error fue que el nuevo nivel superior NavigationController no se ha inicializado correctamente y cargado hasta que se realiza la animación. En mi caso, UserAssignmentsListViewController tiene un método viewDidLoad que no se llama hasta que se realiza la animación, pero establece el título de navegación (en este caso un UIButton). Por lo tanto la animación falla.

La solución es para referirse a un controlador de vista ya inicializado cuando se trata de empujar a la pila. Así inicializar nuestro alto nivel de VC en alguna parte:

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

A continuación, cuando se empuja dos o más VCs a la pila, el nivel superior ya está inicializado y los trabajos de animación (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];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top