【问题标题】:UITabBar disable / enable items on UIButton clickUITabBar 禁用/启用 UIButton 上的项目单击
【发布时间】:2017-11-09 13:26:05
【问题描述】:

我有一个带有自己的 UITabBarController 的 UITabBar,在这个控制器中我正在对 tabBar 进行一些调整,例如禁用/启用 tabBar 项目。我在 viewDidLoad 中做。

但是,这些调整的触发器将位于相关选项卡之一及其视图控制器上。触发器将是一个按钮,一旦按下该按钮,tabBar 上的一项应从“禁用”变为“启用”。

是否有任何我需要使用的 tabBar 重新加载功能,或者我需要以某种方式重新加载 UITabBarController 来实现这一点?

谢谢 - 感谢您提供的任何帮助!

编辑:我的 UITabBarController 和 UIViewController 的 VC 如下。

UITabBarController

class TabBarVC: UITabBarController, TopRatedVCDelegate {


var tabBarItem1 = UITabBarItem()
var tabBarItem2 = UITabBarItem()
var tabBarItem3 = UITabBarItem()
var tabBarItem4 = UITabBarItem()

override func viewDidLoad() {
    super.viewDidLoad()
}

func setbar() {

    let tabBarControllerItems = tabBar.items

    if let tabArray = tabBarControllerItems {
        tabBarItem1 = tabArray[0]
        tabBarItem2 = tabArray[1]
        tabBarItem3 = tabArray[2]
        tabBarItem4 = tabArray[3]
    }
        tabBarItem1.isEnabled = true
        tabBarItem1.badgeValue = "99"
        tabBarItem2.isEnabled = false
        tabBarItem3.isEnabled = true
        tabBarItem4.isEnabled = true
}
}

带按钮的 UIViewController

protocol TopRatedVCDelegate: class {
    func setbar()
}

class TopRatedVC: UIViewController {

@IBOutlet weak var userDefValueLbl: UILabel!

weak var delegate: TopRatedVCDelegate?

override func viewDidLoad() {
    super.viewDidLoad()

}


@IBAction func btnPressed(_ sender: Any) {
    delegate?.setbar()
}
}

【问题讨论】:

  • 您可能希望使用协议/委托模式。这将允许您的trigger button“回调”到您的自定义UITabBarController,您可以在其中处理禁用/启用选项卡(或您想做的任何其他事情)。
  • 这听起来像是可以工作的。你有什么例子我可以做到这一点吗?我实际上以不同的方式尝试了它,一旦按下按钮并在执行检查时将一些值保存到 UserDefaults 中,但在 UITabBarController 中,但这仅在加载 tabBar 后才有效。我希望它可以在我想要的任何时候工作 - 因此,一旦单击按钮以执行检查,就调用栏的“重新加载”...

标签: ios swift uitabbarcontroller uitabbar


【解决方案1】:

让我向您解释一下委托模式。这是一种在控制器和视图等组件之间进行通信的有效方式。 您需要遵循 6 个步骤:

  1. 您需要根据您的要求添加协议。对于您的情况,您可以添加一个名为 updateTabItems 的函数来启用或禁用标签栏项目。
  2. 您需要使用您刚刚创建的协议类型添加一个委托属性,如下所示:weak var delegate: ProtocolType?
  3. 像这样调用委托属性的函数:delegate?.updateTabItems()
  4. 在您的第二个控制器、视图或组件上,它需要像这样符合您的协议class Controller : YourProtocol
  5. 然后,您必须将委托属性设置为self
  6. 最终实现方法updateTabItems

这里是委托模式的完整解释。对你作为 IOS 开发者的日常工作非常重要和有用:Delegation pattern

【讨论】:

  • 嗨,这太棒了!非常感谢你把这个寄过来。我想我理解它,但我确实有一个问题。在第 5 点中,您正在谈论将委托属性设置为 self。在示例文章(委托模式)中,该人将其设置为“prepareForSegue”方法。我没有执行任何 segue,所以我不确定在哪里将代表设置为 self。作为参考,我已将 VC 中的代码添加到原始问题中。
  • 一般来说,你需要把它放在你可以访问你放在另一个类中的委托属性的地方。在示例中,他将其设置在 prepareForSegue 中,因为它实例化了一个视图控制器,他可以在其中访问委托属性并进行设置。
  • 我在看一些视频,每个解释该方法的人都使用 prepareForSegue 实例化 VC,这对我来说是不可用的,因为在 tabBar 上的选项卡之间切换不是真正的 segue,所以我不清楚在哪里否则我实际上可以实例化它:-\
猜你喜欢
  • 2017-08-06
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多