Swift 禁用带有功能的标签栏项目

Swift disable tab bar item with function

我的标签栏中有一个项目在满足特定条件之前不应启用。我可以从我的子类 UITabBarController 中禁用 viewDidLoad() 中的那个项目,但是我在创建一个我可以在需要时调用的函数时遇到了问题。以下是我到目前为止所拥有的 - 由于我不明白的原因,我的标签栏项目数组始终为零! (除非它在 ​​viewDidLoad() 中初始化,它工作正常。)

func setTabState(whichTab: Int) {
    let arrayOfTabBarItems = self.tabBar.items

    if let barItems = arrayOfTabBarItems {
        if barItems.count > 0 {
            let tabBarItem = barItems[whichTab]
            tabBarItem.isEnabled = !tabBarItem.isEnabled
        }
    }
}

请在您想要在 UITabbarController class

中禁用 tabbar 项目的地方输入以下代码
//Here Disable 0 Tabbar item

DispatchQueue.main.async {
    let items = self.tabBar.items!
    if items.count > 0 {
         items[0].isEnabled = false
    }
}

结果证明该解决方案结合了 Rohit Makwana 的回答和一些实验:

  1. 在我的 CustomTabBarViewController 的 viewDidLoad() 中,我使用了 Rohit 的
    answer 设置标签栏项目的初始状态。我仍然不明白为什么必须使用 DispatchQueue,但一次只能做一件事。
  2. 在单独的视图控制器中,我采用了 UITabBarControllerDelegate 协议并设置了
    tabBar?.delegate = self.
  3. 最后,我在一个变量上创建了一个 属性 观察器,当满足某些条件时该变量会设置为 true:

var allButtonsPressed = false {
   didSet {
      if let items = tabBarController?.tabBar.items {
         items[1].isEnabled = allButtonsPressed
      }
   }
}

而且有效!当 allButtonsPressed 为真时,选项卡栏项目立即启用。当它为假时 - 禁用。再加上 Rohit 帮助我找到解决方案。现在,开始了解有关 DispatchQueue 的更多信息...