如何停止加载标签栏项目选择的视图?

Posted

技术标签:

【中文标题】如何停止加载标签栏项目选择的视图?【英文标题】:How to stop loading the view on tabbar item selection? 【发布时间】:2011-08-26 08:26:46 【问题描述】:

我有一个带有三个标签的标签栏控制器。在第一个选项卡中,我有一个导航控制器。现在用户在第一个选项卡中导航以进行一些付款,因此我禁用了默认的后退按钮,因为我不希望用户在交易之间使用后退按钮。但是当用户再次按下选项卡时,他/她会导航到根视图。如何检测标签栏选择或如何避免再次加载标签?

请帮助我!谢谢!!

注意:我不确定我的问题是否已经在其他帖子中的 *** 上得到回答,但我进行了搜索,但没有得到任何答案。如果是这样,请随时将我重定向到该答案并删除此帖子。谢谢!

【问题讨论】:

【参考方案1】:

检查UITabBarControllerDelegate Protocol Reference。

基本思想是每当用户单击选项卡项时,都会调用 UITabBarController 委托中的 tabBarController:shouldSelectViewController: 选择器。

因此,通过适当地定义该方法,您有机会在当前视图控制器被用户通过单击标签栏选择的视图控制器替换之前进行自己的处理。

因此,如果您希望阻止当前视图控制器被替换,即当事务正在进行时,只需从此选择器返回 NO。

【讨论】:

【参考方案2】:

通过这种方式,您可以打开任何控制器或对特定索引的选择执行任何操作。

 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 
        let selectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController)!

        if selectedIndex == 1
            //Do any thing. 
            return false
        
        return true
    

【讨论】:

【参考方案3】:

你必须这样做..

- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc
     
    UIViewController *tbSelectedController = tbc.selectedViewController;
    if ([tbSelectedController isEqual:vc])
             
        return NO;     
          
    return YES; 
 

【讨论】:

【参考方案4】:

在 Swift 5 中:

继续 Talha Rasool 的回答,不要忘记在 viewDidLoad 函数中委托 self。这将让当前 MainTabBarController 处理所有委托方法

import UIKit

class MainTabBarController: UITabBarController, UITabBarControllerDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()
        self.delegate = self // Delegate self to handle delegate methods.
    

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 
        let selectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController)!
        if selectedIndex == 1
            //Do anything. 
            return false
        
        return true
    

【讨论】:

很好的答案,效果很好【参考方案5】:

当用户导航到支付控制器时,您可以隐藏标签栏。

在您的代码中使用此代码,当您导航到另一个视图时

yourcontroller.hidebottombarwhenpushed=YES;

【讨论】:

我不认为这是一个好的解决方案,因为那时你必须检查视图布局,看看当底部栏被隐藏时它是否仍然有效......实现 shouldSelectViewController 委托功能是路要走..

以上是关于如何停止加载标签栏项目选择的视图?的主要内容,如果未能解决你的问题,请参考以下文章

目标C - 再次点击标签栏项目时,如何重新加载网页视图?

当我点击不同的标签栏项目时,Lottie 动画停止

加载新的 TabBar 视图时如何卸载 TabBar 视图?

点击时如何停止标签栏项目图像的背景宽度变化?

按下标签栏项目时如何关闭视图?

没有标签栏项目的视图的标签栏 iPhone 应用程序