tabBar:didSelectItem 和 popToRootViewControllerAnimated

tabBar:didSelectItem and popToRootViewControllerAnimated

我有一个 UITabBarController,其中包含几个 UINavigationController。当您单击选项卡栏项目时,我希望它将用户导航回该导航控制器的根视图控制器。我有以下代码,它适用于 iPad2、iPhone4、iPhone5,但不适用于 iPhone5。有谁知道为什么会这样?

Update:如果我将 afterDelay 更改为 .8 那么它将起作用,但会在更改视图时创建一个 flash - 不是很理想!

@implementation NavigationTabs

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
    // Thanks to 
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController * view = (UINavigationController *)self.selectedViewController;
        [view performSelector:@selector(popToRootViewControllerAnimated:) withObject:nil afterDelay:.5];
    }
}

@end

更新:工作代码如下:

@interface NavigationTabs : UITabBarController <UITabBarControllerDelegate>

@end

@implementation NavigationTabs

- (void)viewDidLoad {
    self.delegate = self;
}

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    if ([viewController isKindOfClass:[UINavigationController class]]) {
        [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
    }
    return YES;
}

@end

这样做可以避免闪烁,

每次您从选项卡 A 导航到选项卡 B 时,在您调用

[self.tabBarController setSelectedIndex:<index of tab>];

在选项卡栏上,调用选项卡 A 上的 popToRootViewControllerAnimated:

这样,一旦您导航回选项卡 A,就不必将其弹出到根目录 viewController,它已经在根目录中了。

如果您不通过代码更改选项卡,那么您可以注册以从 UITabBarControllerDelegate

获取委托方法

您可以实施

- (BOOL)tabBarController:(UITabBarController *)tabBarController
shouldSelectViewController:(UIViewController *)viewController

获得关于 viewController 被按下的通知