2010-12-03 22 views
3

Je rencontre un problème avec une application iPhone utilisant UINavigationController. Quand j'utilise pushNavigationController, cela fonctionne très bien. L'iPhone fait son animation en passant au ViewController suivant. Mais lorsque vous utilisez un tableau de ViewControllers et la méthode setViewControllers, il y a un petit problème dans l'animation qui peut devenir un bogue d'animation clairement visible.L'utilisation de setViewController de UINavigationController sur l'iPhone ne se comporte pas correctement

L'extrait suivant est appelé dans le ViewController racine. En fonction d'une condition, il doit soit basculer sur ViewController1, soit directement dans ViewController2. Dans ce dernier cas, l'utilisateur peut retourner à vc1, puis à la racine.

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]; 

Comme vous pouvez le voir, je vais ajouter le premier et peut-être la deuxième VC au tableau, la mise enfin NavigationController pile avec animation. Cela fonctionne correctement si j'ajoute seulement le premier contrôleur. Mais dans le cas où l'animation devrait aller au 2ème contrôleur, le titre de la barre de navigation ne sera pas "volant". Au lieu de cela, il y a un titre vide jusqu'à ce que l'animation soit terminée. Et, pire encore, si je remplace le titre de la barre de navigation par un bouton personnalisé, ce bouton sera affiché dans le coin supérieur gauche jusqu'à ce que l'animation soit terminée. C'est tout à fait un bug d'affichage.

J'ai essayé d'utiliser une solution de contournement avec plusieurs méthodes pushViewController, mais l'animation ne semble pas correcte. Je veux que la navigation fasse son animation de la même manière que le fait PushViewController. La seule différence ici est que je n'ajoute pas de VC mais que je mets toute la pile à la fois. Y a-t-il une autre solution de contournement ici, ou cela pourrait-il être considéré comme un bug d'un framework? J'ai pensé à utiliser seulement pushNavController pour VC2, puis en quelque sorte insérer VC1 dans la pile, mais cela ne semble pas possible.

Merci pour tous les conseils et astuces. :-)

Données techniques: J'utilise iOS 4.2, compilant pour 4.0.

+0

Avez-vous trouvé une solution? Si oui, partagez s'il vous plaît. Je suis confronté à un problème d'animation similaire. – Pria

+0

Non, pas une solution qui fonctionne comme le comportement normal avec pushNavigationController. J'ajoute toujours à la fois VC et appel à setViewControllers, mais le second VC n'a pas de titre de barre de navigation au début. Je l'ai mis (dans mon cas, c'est un bouton de titre) une fois l'animation terminée. Ça n'a pas l'air si bien mais ça marche. – qwertfisch

Répondre

5

Finalement, j'ai trouvé la solution. L'erreur était que le nouveau NavigationController de haut niveau n'a pas été initialisé et chargé correctement jusqu'à ce que l'animation soit terminée. Dans mon cas, UserAssignmentsListViewController a une méthode viewDidLoad qui ne sera pas appelée jusqu'à ce que l'animation soit terminée, mais elle définit le titre de navigation (ici: un UIButton). Par conséquent, l'animation échoue.

La solution consiste à se référer à un contrôleur de vue déjà initialisé lorsqu'il s'agit de le pousser vers la pile. Donc initialiser notre VC-haut niveau quelque part:

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

Ensuite, en poussant deux ou plusieurs VCs à la pile, le niveau haut est déjà initialisé et les œuvres d'animation (en suivant l'exemple de ma question d'origine):

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];