如何将popToRootViewControllerAnimated与我的标签集成?

时间:2010-12-20 07:42:08

标签: objective-c iphone-sdk-3.0 ios4

我正在尝试使用popToRootViewControllerAnimated使我的一个标签按钮转到根目录。我的问题是:我在哪里放这个代码才能工作?我通过Interface Builder创建了我的标签...是否必须进行硬编码以使其正常工作?

以下是我要使用的代码:

[self.navigationController popToRootViewControllerAnimated:YES];

AppDelegate中的新代码:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if (viewController = HomeViewController) {
        [HomeViewController popToRootViewControllerAnimated:NO];
    }
}

3 个答案:

答案 0 :(得分:7)

亚当 - 我最终放弃了子类的想法,即使它有效,因为有一个更简单的方法。

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if ([viewController isKindOfClass:[UINavigationController class]]) {
        [(UINavigationController*)viewController popToRootViewControllerAnimated:YES];
    }
}

这是所需的代码。我上传了this sample project来玩。要点是

  • UITabBarController委托必须 设置为App Delegate。
  • 应用程序 代表必须实施<UITabBarControllerDelegate>协议。
  • App代表必须 实现上面的代码。

示例项目还显示了一种选择性地选择使用哪种导航控制器的方法。

答案 1 :(得分:0)

是的,这需要硬编码。

如果您正在使用UITabBarController(我假设您可能是),则需要对其进行子类化并覆盖。这将尝试弹出选项卡上每个导航控制器的根视图控制器。如果选项卡项的根视图不是导航项,则会出现异常。

@interface MyTabBarControllerSubClass : UITabBarController {
}
@end
@implementation MyTabBarControllerSubClass
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
    [super tabBar:tabBar didSelectItem:item];
    [(UINavigationController*)self.selectedViewController popToRootViewControllerAnimated:YES];
}
@end

不要忘记在IB中选择你的子类: - )

您还可以创建一个UITabBarControllerDelegate。虽然它可能更难实施。

答案 2 :(得分:0)

不知道为什么,但对于我使用Swift的Xcode 6,这个解决方案没有成功。即使调用didSelectViewController,似乎popToRootViewControllerAnimated(false)也不是。

我发现调用shouldSelectViewController对我来说效果很好:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    if viewController.isKindOfClass(UINavigationController) {
        (viewController as UINavigationController).popToRootViewControllerAnimated(false)
        return true
    }
    return true
}

不确定这是否是一个好方法。