如何正确更新 TabBarItem 的徽章值?

How to correctly update TabBarItem's badge value?

我有三个 tableViewController,它们由 tabBarController 管理。并且每个 tabBarItem 都必须像任何其他应用程序一样收到关于过期项目的警报。在我的第一个 tableViewController 中,我尝试在 tabBarItembadgeValue 中显示过期项目计数。这些值来自 fetchedResultsControllerfetchedObjects.count,工作状态良好。

func tabBarBadgeUpdater() {

    for viewController in (self.tabBarController?.viewControllers)! {

        let overdue = self.fetchedResultsController.fetchedObjects?.filter({ (record) -> Bool in
            return (record.date?.compare(Date()) != .orderedDescending)
        })

        print(overdue!.count)

        if viewController.tabBarItem.tag == 1 {

            if overdue!.count != 0 {
                DispatchQueue.main.async(execute: {
                    viewController.tabBarItem.badgeValue = "\(overdue!.count)"
                    viewController.tabBarItem.badgeColor = UIColor.init(red: 0.0, green: 0.5, blue: 0.0, alpha: 1.0)
                    self.tableView.reloadData()
                })
            } else {
                DispatchQueue.main.async(execute: {
                    viewController.tabBarItem.badgeValue = ""
                    viewController.tabBarItem.badgeColor = .clear
                    self.tableView.reloadData()
                })
            }
        }
    }
}

但我的问题是删除它们。当我试图从模型中删除最后一个对象时,它仍然显示值 1。

如何正确显示TabBarItembadgeValue

为了清除我的,我只是将 badgeValue 设置为 nil,而不是 "":

tabController.tabBar.items[0].badgeValue = nil

我建议您实施 controllerDidChangeContent,这是 fetchedResultsController 的委托方法。每次您的模型更改时都会调用它,您可以查询计数并更新您的徽章编号。

我找到了一个 Swift 5 解决方案来设置 tabBar 项目,当你希望能够移动你的 tabBar 项目时,它不只是标记固定 tabBar 项目位置的标志。 这是我的解决方案,适用于将 UiView 放置在 tabBar 中的任何位置:

// set badge value on your own nav controller

self.navigationController?.tabBarItem.badgeValue = scoreBoxLabelOutlet.text

// Then use a nil value to remove the Badge Item.
self.navigationController?.tabBarItem.badgeValue = nil 

我使用一个名为 scoreBoxLabelOutlet.text 的出口来收集信息。