Iphone 在UITABBARC控制器的双击上防止自动popToRootViewController

Iphone 在UITABBARC控制器的双击上防止自动popToRootViewController,iphone,uinavigationcontroller,uitabbarcontroller,Iphone,Uinavigationcontroller,Uitabbarcontroller,UITabBarController的默认行为是在第二次点击特定选项卡时将包含的UINavigationController弹出到根视图控制器。我有一个特殊的用例,我希望它不会自动工作,我很难想出如何防止这种情况 有人碰到过这个吗?如果有,你是怎么做的?我是否需要将UINavigationController子类化并重写popToRootViewController,还是有更简单的方法?使用的方法 不要忘记将选项卡栏控制器的委托设置为实际实现此委托方法的对象。我就是这么做的: - (BOOL)t

UITabBarController的默认行为是在第二次点击特定选项卡时将包含的UINavigationController弹出到根视图控制器。我有一个特殊的用例,我希望它不会自动工作,我很难想出如何防止这种情况

有人碰到过这个吗?如果有,你是怎么做的?我是否需要将UINavigationController子类化并重写popToRootViewController,还是有更简单的方法?

使用的方法


不要忘记将选项卡栏控制器的委托设置为实际实现此委托方法的对象。

我就是这么做的:

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

    if ([[tabBarController viewControllers] objectAtIndex:[tabBarController selectedIndex]] == viewController)

            return NO;

    return YES;

}

关于

这种行为有点奇怪,但在层次较深的情况下,这是一种方便的快捷方式

您可以实现以下UITABBARCONTROLLEDELEGATE方法来禁用此系统范围的快捷方式:

#pragma mark -
#pragma mark UITabBarControllerDelegate

- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
    UIViewController *tbSelectedController = tbc.selectedViewController;

    if ([tbSelectedController isEqual:vc]) {
        return NO;
    }

    return YES;
}

以下是Swift 3版本:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    return viewController != tabBarController.selectedViewController
}

更新Swift 4.1

停止双击所有选项卡

仅在一个特定选项卡上停止双击。这是第三个标签

希望对你有帮助


谢谢

太棒了。我不知道我怎么会在代理协议中遗漏了这一点。它就像一个符咒。谢谢很不错的。谢谢分享!别忘了将选项卡栏控制器的委托设置为实际实现此功能的对象
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    return viewController != tabBarController.selectedViewController
}
extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    //for blocking double tap on all tabs.
    return viewController != tabBarController.selectedViewController
}}
extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    //for blocking double tap on 3rd tab only
    let indexOfNewVC = tabBarController.viewControllers?.index(of: viewController)
    return ((indexOfNewVC != 2) ||
        (indexOfNewVC != tabBarController.selectedIndex))       
}}