我的应用程序有3个标签栏项目,每个项目都映射到一个单独的视图控制器。我的问题是第一个控制器是一个UINavigation控制器,它深入钻取约3个级别。我对导航没有任何问题,但是当我点击不同的标签栏项目然后当我返回第一个标签栏项目(带有UINav控制器的项目)时,我宁愿重置为导航序列中的第一个控制器。
我读过你必须做的事情:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
[[self navigationController] popViewControllerAnimated:NO];
}
但我不确定应该把这个方法放在哪里。谁是标签栏控制器的代表?它在AppDelegate中设置......它应该进去吗?
感谢。
答案 0 :(得分:12)
当然,在您创建UITabBarController的AppDelegate中,您可以将标签栏控制器的委托设置为self(即AppDelegate)。然后你可以在你的AppDelegate中放置tabBar:didSelectItem:方法,只要用户点击UITabBarItem就应该调用它。我将在AppDelegate中创建一个实例变量属性,并保留对用于Nav控制器选项卡的UITabBarItem的引用(让我们称之为tabBarItemForNavControllerTab)。您还应该参考第一个选项卡中的导航控制器,以便您可以从AppDelegate控制它(让我们称之为navControllerInFirstTab)
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
if (item != self.tabBarItemForNavControllerTab) {
[self.navControllerInFirstTab popToRootViewControllerAnimated:NO];
}
}
您可以在UINavigationController上使用popToRootViewControllerAnimated:而不是逐个弹出堆栈中的每一个。
答案 1 :(得分:1)
您需要将自己设置为tabBar的委托并实现 - tabBar:didSelectItem: 你问导航控制器的意见 [[self navigationController] viewControllers]返回一个UIViewControllers的NSArray,然后弹出数组中的每个视图控制器,直到你到达根视图。