我有一个带有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中的更新,主要区别是应用程序未处于已知状态。
答案 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。