我正在尝试使用popToRootViewControllerAnimated使我的一个标签按钮转到根目录。我的问题是:我在哪里放这个代码才能工作?我通过Interface Builder创建了我的标签...是否必须进行硬编码以使其正常工作?
以下是我要使用的代码:
[self.navigationController popToRootViewControllerAnimated:YES];
AppDelegate中的新代码:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if (viewController = HomeViewController) {
[HomeViewController popToRootViewControllerAnimated:NO];
}
}
答案 0 :(得分:7)
亚当 - 我最终放弃了子类的想法,即使它有效,因为有一个更简单的方法。
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if ([viewController isKindOfClass:[UINavigationController class]]) {
[(UINavigationController*)viewController popToRootViewControllerAnimated:YES];
}
}
这是所需的代码。我上传了this sample project来玩。要点是
<UITabBarControllerDelegate>
协议。 示例项目还显示了一种选择性地选择使用哪种导航控制器的方法。
答案 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
}
不确定这是否是一个好方法。