【问题标题】:How to disable/enable a particular UITabBar Item,如何禁用/启用特定的 UITabBar 项,
【发布时间】:2014-05-23 00:43:18
【问题描述】:

我的UITabbarController 中有 3 个标签,它们是我在 Appdelegate 中创建的。

当我打开应用程序时,我已将选定的 tabbarItem 设为第三个 tabbarItem。

用户在登录时只能选择索引 0 处的UITabBarItem

当用户位于TabBarItem_2 时,我尝试了所有方法来限制用户访问TabBarItem_0。 但没有任何效果。我用过

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

}

但它没有按我的意愿工作。我检查了stackoverflow,发现了几乎相同的问题,我在哪里找到了这个委托。但这并不适合我。我用谷歌搜索,但除了 stackoverflows 链接之外找不到任何解决方案,这一次没有帮助。

在单击该禁用的 TabBar 项时,我必须显示一个弹出窗口。我该如何实现呢?

【问题讨论】:

  • 你在那个方法中放了什么代码,你在那里得到了什么实际上并没有做任何事情,实际上可能无法编译。

标签: ios objective-c uitabbarcontroller uitabbaritem


【解决方案1】:

您可以在代码中执行此操作

- (void)viewDidLoad {
    ...
    [self checkLogin];
    ...
}

- (void)checkLogin {
    if (!loggedIn) {
        [[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:NO];
    } else {
        [[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:YES];
    }
}

- (void)tapLogin {
  // Do the login action
}

- (void)processLoginResult {
  // Process the result of the login action
  // If the result is success, set 'loggedIn = YES'
  // Otherwise, set 'loggedIn = NO'
  ...
  [self checkLogin];
  ...
}

【讨论】:

  • 好的,它禁用了标签栏,但是在点击那个禁用的标签栏项目时,我必须显示一个弹出窗口。我该如何实现呢?
【解决方案2】:

试试这样的,

 - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController; 
{    
       if (tabBarController.selectedIndex == 0) {
            if(isUserLoggedIn)
                return YES;
            else
                return NO;
        }

        return YES; 
}

如果这不起作用,那么,

在应用委托中创建 bar bar 后添加,

[[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:FALSE];

登录后再次启用

[[[[self.tabBarController tabBar]items]objectAtIndex:0]setEnabled:TRUE];

【讨论】:

  • 没有按预期工作。让我解释一下,例如我在 tabitem_3 并且我必须阻止 tabitem_1 然后这个代表第一次没有停止它,更多的是当我再次点击这个 tabitem_1 时,不会调用 deelgate
  • 工作但并不完美,即当我单击解锁选项卡时,它工作正常,但是当我单击锁定选项卡时,尽管停留在那里,它会转到上一个单击的选项卡
  • 请注意,UITabBarControllerDelegate 需要
【解决方案3】:

如果您想使用情节提要执行此操作,只需在目标视图控制器场景中选择 TabBarItem 并取消选中“启用”框。

【讨论】:

    【解决方案4】:

    这就是我在 Swift 2.1 中所做的:

    self.tabBarController!.tabBar.items![0].enabled = false
    

    【讨论】:

      【解决方案5】:

      当我点击标签栏项目时,我用来在当前视图顶部显示一个弹出窗口的快速技巧。

      在您的 TabBarViewController 类中,实现 UITabBarControllerDelegate 并记住设置 self.delegate = self

      之后

      func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
          if viewController.title == "Unique_title" //set an unique title for the view controller in storyboard or the view controller class.
          {
              performSegueWithIdentifier("YourModalViewIdentifier", sender: nil)
              return false
          } else {
              return true
          }
      }
      

      这应该有助于您在 uitabbaritem 上收到点击时显示模式视图。我知道使用标题作为唯一标识符是不好的做法,但这只是实现您想要的快速解决方案。

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:

        这是在 Swift 3 和 4

        中禁用标签栏项目的方法
        tabBarController.tabBar.items![0].isEnabled = false
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-24
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          • 2018-11-21
          • 2011-02-06
          • 1970-01-01
          相关资源
          最近更新 更多