0

J'ai un UITabBarController avec un tableau de UINavigationControllers (comme l'application iPod) afin que je puisse changer d'onglet et que chaque onglet possède une pile de contrôleurs de vues.popToRootViewController ne fonctionne pas avec un tableau de UINavigationControllers

Je veux être en mesure de pop tous vue contrôleurs revenir à la racine si les utilisateurs touche un nouvel onglet ont donc mis en œuvre la méthode déléguée UITabBarController:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
// Pop all view controllers back to the root view controller 
for (UINavigationController *nc in tabBarController.viewControllers){ 
    [nc popToRootViewControllerAnimated:NO]; 
} 
} 

Pour vérifier cela fonctionne correctement, j'ai mis point de rupture sur la méthode dealloc de mes différents viewControllers.

Il semble que l'onglet que je suis en train de commuter apparaisse sur le contrôleur de la vue racine, mais pas sur l'onglet que je suis en train de changer. Il me manque quelque chose d'évident ici? J'ai 4 onglets et la boucle for est exécutée 4 fois, et fait 4 appels distincts à popToRootViewController.

La raison pour laquelle cela est important est que si je suis au rootViewController, il est sûr de mettre à jour la base de données sous-jacente sans laisser l'utilisateur dans une vue qui n'a plus de sens ou est valide. Par exemple, la racine a une table d'éléments, en touchant un élément vous donne des détails sur cet élément. Si l'utilisateur touche un autre onglet, le contrôleur de vue des éléments de détail est toujours en mémoire. Si l'application reçoit une mise à jour dans laquelle cet enregistrement n'est plus valide, le fait d'y revenir par tabulation entraînera un blocage ou un état incohérent.

Un espoir qui a du sens et de l'aide serait utile même si c'est simplement des idées sur la façon de résoudre le problème.

Cordialement

Dave

post-scriptum

Tout cela provient du fait que mon application utilisée pour vérifier une mise à jour au démarrage jeter l'ancienne base de données et utiliser le nouveau. Avec iOS4 et au-dessus, mon application ne se fait plus tuer, donc il faut aussi vérifier la mise à jour dans applicationWillEnterForeground, la différence majeure étant que l'application n'est pas dans un état connu.

Répondre

1

J'ai un travail autour, même si je ne suis pas sûr de savoir pourquoi cela fonctionne, si heureux d'accepter une explication plus complète.

J'ai également mis en œuvre l'autre méthode UITabBarController shouldSelectViewController

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{ 
    // Pop all view controllers back to the root view controller 
    for (UINavigationController *nc in tabBarController.viewControllers){ 
     [nc popToRootViewControllerAnimated:YES]; 
    } 
    return YES; 
} 

Ce travail a fourni le drapeau d'animation est réglé sur OUI.

+0

Thx Dave, ça marche –