单击选项卡栏时,将UINavigationController重置为第一个控制器

时间:2010-11-06 20:47:50

标签: iphone objective-c ios

我的应用程序有3个标签栏项目,每个项目都映射到一个单独的视图控制器。我的问题是第一个控制器是一个UINavigation控制器,它深入钻取约3个级别。我对导航没有任何问题,但是当我点击不同的标签栏项目然后当我返回第一个标签栏项目(带有UINav控制器的项目)时,我宁愿重置为导航序列中的第一个控制器。

我读过你必须做的事情:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    [[self navigationController] popViewControllerAnimated:NO];
}

但我不确定应该把这个方法放在哪里。谁是标签栏控制器的代表?它在AppDelegate中设置......它应该进去吗?

感谢。

2 个答案:

答案 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,然后弹出数组中的每个视图控制器,直到你到达根视图。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference.html