标签栏第二次点击弹出到导航控制器 - 如何停止它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标签栏第二次点击弹出到导航控制器 - 如何停止它相关的知识,希望对你有一定的参考价值。

我有一个基于标签栏的应用程序。所有选项卡都有一个导航控制器作为根。如果用户在选项卡处于活动状态时再次点击选项卡,则会弹回导航控制器。 我怎么能阻止这种行为?

这是一些更新:

所以实际上我有一个导航控制器+一个隐藏的视图控制器,可以做出一些决定+另一个视图控制器。对于原始问题中的误导性信息,我们深表歉意。我使用隐藏的viewcontroller用于所有标签,其中3个,因为如果用户没有登录,我在所有3个登录屏幕上。如果用户登录,则弹出登录屏幕,然后放入1,2 ,每个选项卡上有3个单独的viewcontrollers。

首先点击:

 0 : class=Crossing: 0x645c8a0>  
 1 : class=FavoritesViewController: 0x64ac140>  
 shouldSelectViewController : UINavigationController  
 UINavigationController topclass:FavoritesViewController  
 myTabBarController.selectedViewController :UINavigationController  
 did disappear  
 didSelectViewController : UINavigationController  
 UINavigationController topclass:FavoritesViewController  

第二次点击:

 0 : class=Crossing: 0x645c8a0>  
 1 : class=FavoritesViewController: 0x64ac140>  
 shouldSelectViewController : UINavigationController  
 UINavigationController topclass:FavoritesViewController  
 myTabBarController.selectedViewController :UINavigationController  
 didSelectViewController : UINavigationController  
 UINavigationController topclass:Crossing  
答案

@MarkGranoff在这方面做得很好,但是做到这一点的方法是做这样的事情:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if ([tabBarController.viewControllers indexOfObject:viewController] == tabBarController.selectedIndex)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

或者以不那么冗长的方式:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    return (viewController != tabBarController.selectedViewController);
}

如果您只想阻止某个选项卡的默认行为,那么您可以执行以下操作:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    NSUInteger indexOfNewViewController = [tabBarController.viewControllers indexOfObject:viewController];
    // Only the second tab shouldn't pop home 
    return ((indexOfNewViewController != 1) ||
            (indexOfNewViewController != tabBarController.selectedIndex));
}
另一答案

斯威夫特3

  1. 将你的UITabBarController子类化并在该类上实现UITabBarControllerDelegateclass viewMain: UITabBarController, UITabBarControllerDelegate {
  2. viewDidLoad中,将您的类的委托设置为自己 self.delegate = self
  3. 添加此功能 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { return (viewController != tabBarController.selectedViewController); }
另一答案

在您的应用程序委托(我假设是您的UITabBarController的委托)中,尝试实现tabBarController:shouldSelectViewController:并在要选择的视图控制器不在其根视图时返回NO。当然,这可能适用于当你试图回到它们时切换掉的标签...嗯......

另一答案

您可以在中检查视图控制器

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

并且您可以跟踪所选的视图控制器。

另一答案

更新Swift 4.1

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

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))      
}}

停止双击所有选项卡。

extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    //for blocking double tap on all tabs.
    return viewController != tabBarController.selectedViewController
}}

谢谢!!!

以上是关于标签栏第二次点击弹出到导航控制器 - 如何停止它的主要内容,如果未能解决你的问题,请参考以下文章

当标签栏点击两次时禁用自动弹出到根视图控制器

iOS禁用按标签栏按钮弹出到根视图

连接到导航控制器时如何将 ViewController 弹出到根目录

当我在 iPhone 的导航栏上单击返回时,如何弹出到所需的视图控制器

弹出到根视图控制器时导航栏消失

弹出到导航堆栈中的特定视图控制器