popToRootViewController不适用于UINavigationControllers数组

时间:2010-11-11 13:21:01

标签: iphone uiviewcontroller uinavigationcontroller uitabbarcontroller

我有一个带有UINavigationControllers数组的UITabBarController(比如iPod应用程序)所以我可以切换标签,每个标签都有一堆视图控制器。

如果用户触摸新标签,我希望能够将所有视图控制器弹回根目录,以便实现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];
 } 
}

为了检查这是否正常,我在各种viewControllers的dealloc方法上设置了一个断点。

似乎我切换到根视图控制器的选项卡,但我切换的选项卡没有。我错过了一些明显的东西吗?我有4个选项卡,for循环执行4次,并对popToRootViewController进行4次单独调用。

这一点很重要的原因是,如果我在rootViewController中,我可以安全地更新底层数据库,而不会让用户处于不再有意义或有效的视图中。例如,根有一个项目表,触摸项目可以为您提供有关该项目的详细信息。如果用户触摸另一个选项卡,则详细项目视图控制器仍在内存中。如果应用程序收到此记录不再有效的更新,则回显到该状态将导致崩溃或不一致状态。

希望这是有道理的,任何帮助都会有用,即使它只是关于如何解决问题的想法。

此致

戴夫

P.S。

这一切都源于我的应用程序用于在启动时检查更新,抛出旧数据库并使用新数据库。使用iOS4及更高版本,我的应用程序不会再被杀死,因此必须检查applicationWillEnterForeground中的更新,主要区别是应用程序未处于已知状态。

1 个答案:

答案 0 :(得分:1)

我有一个解决方法,虽然我不确定它为什么有效,但很高兴接受更全面的解释。

我还实现了另一个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;
}

这可以提供动画标志设置为YES。