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

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

请帮助我!谢谢!!

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

【问题讨论】:

    标签: iphone uinavigationcontroller navigation uitabbarcontroller


    【解决方案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 委托功能是路要走..
          猜你喜欢
          • 1970-01-01
          • 2014-06-21
          • 2016-07-27
          • 2016-12-07
          • 1970-01-01
          • 2017-04-08
          • 2016-07-09
          • 2012-11-06
          • 1970-01-01
          相关资源
          最近更新 更多