如何停止在tabbar项目选择上加载视图?

时间:2011-05-16 10:44:50

标签: iphone uinavigationcontroller navigation uitabbarcontroller

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

请帮帮我!!谢谢!!

注意:我不确定我的问题是否已在其他帖子的stackoverflow上得到解答,但我确实搜索过,但没有得到任何答案。如果是这样,请随时将我重定向到该答案并删除此帖子。 Thanx!

5 个答案:

答案 0 :(得分:5)

检查UITabBarControllerDelegate Protocol Reference

基本思想是,只要用户点击标签项,就会调用UITabBarController委托中的tabBarController:shouldSelectViewController:选择器。

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

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

答案 1 :(得分:3)

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

 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
    }

答案 2 :(得分:1)

你必须这样做..

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

答案 3 :(得分:0)

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

答案 4 :(得分:-2)

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

导航到其他视图时,在代码中使用此代码

yourcontroller.hidebottombarwhenpushed = YES;