Swift 如何正确更新TabBarItem';什么是徽章价值?

Swift 如何正确更新TabBarItem';什么是徽章价值?,swift,uitableview,core-data,uitabbarcontroller,nsfetchedresultscontroller,Swift,Uitableview,Core Data,Uitabbarcontroller,Nsfetchedresultscontroller,我有一个三个tableViewController,它们由tabBarController管理。每个tabBarItem都必须像其他应用程序一样,对过期项目发出警报。在我的第一个tableViewController中,我尝试在tabBarItem的badgeValue中显示过期项目计数。这些值来自fetchedResultsController的fetchedObjects.count,它处于良好的工作状态 func tabBarBadgeUpdater() { for viewCo

我有一个三个
tableViewController
,它们由
tabBarController
管理。每个
tabBarItem
都必须像其他应用程序一样,对过期项目发出警报。在我的第一个
tableViewController
中,我尝试在
tabBarItem
badgeValue
中显示过期项目计数。这些值来自
fetchedResultsController
fetchedObjects.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


如何正确显示
TabBarItem
badgeValue

要清除我的,我只需将badgeValue设置为nil,而不是“”:


要清除我的,我只需将badgeValue设置为nil,而不是“”:


我建议您实现
controllerDidChangeContent
,这是
fetchedResultsController
的委托方法。每次您的型号更改时,将调用此功能,您可以查询计数并更新您的徽章编号

我建议您实现
controllerDidChangeContent
,这是
fetchedResultsController
的委托方法。每次您的型号更改时,将调用此功能,您可以查询计数并更新您的徽章编号

我找到了一个Swift 5解决方案,当您希望能够移动选项卡栏项目时,可以设置选项卡栏项目,而不仅仅是标记固定选项卡栏项目位置的徽章。 以下是我的解决方案,它适用于将UiView放置在选项卡栏中的任何位置:

// 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的插座来收集信息。

我找到了一个Swift 5解决方案,当您希望能够移动tabBar项目,而不仅仅是标记固定tabBar项目位置的徽章时,可以设置tabBar项目。 以下是我的解决方案,它适用于将UiView放置在选项卡栏中的任何位置:

// 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的出口来收集信息。

它甚至达到了您将其设置为“”的代码吗?另一种选择是在模型更改时实施
controllerdChangeContent
,然后从
fetchedResultsController
获取计数,并将您的徽章设置为该数字。当我向模型添加新值后,该值消失。但是一次又一次,我会得到相同的结果。您是否在
viewController.tabBarItem.badgeValue=“”
尝试了断点?将badgeValue设置为
nil
而不是
在我的项目中起作用。可能我的问题是重新加载数据。如果我的第一个VC中有最后一个对象,并且我试图将其从模型中删除。成功删除后,我从控制台收到一条消息,如:“1”。这意味着我有一件过期的东西。我将转到secondVC,然后再回到firstVC,我的firstVC的ViewDidAspect方法将被调用,firstVC将成为重新加载的tableView。还有徽章不见了。在控制台“0”中。您是否按照上述建议尝试了
controllerDidChangeContent
?这样你就不必担心你的徽章代码放在哪里;只有当您的模型更改时,它才会更改。它是否达到您将其设置为“”的代码?另一种选择是在模型更改时实施
controllerdChangeContent
,然后从
fetchedResultsController
获取计数,并将您的徽章设置为该数字。当我向模型添加新值后,该值消失。但是一次又一次,我会得到相同的结果。您是否在
viewController.tabBarItem.badgeValue=“”
尝试了断点?将badgeValue设置为
nil
而不是
在我的项目中起作用。可能我的问题是重新加载数据。如果我的第一个VC中有最后一个对象,并且我试图将其从模型中删除。成功删除后,我从控制台收到一条消息,如:“1”。这意味着我有一件过期的东西。我将转到secondVC,然后再回到firstVC,我的firstVC的ViewDidAspect方法将被调用,firstVC将成为重新加载的tableView。还有徽章不见了。在控制台“0”中。您是否按照上述建议尝试了
controllerDidChangeContent
?这样你就不必担心你的徽章代码放在哪里;只有当你的模型改变了,它才会改变。谢谢你的支持和回答!我不知道应该在哪里调用我的函数?在ViewDidDisplay或ViewWillDisplay的内部?但这两种方法在运行时都不起作用。因此,我调用了这个函数cellForRowAt indexPath和ViewDidAspect。也许我的问题是重新加载数据?再次感谢你的帮助!谢谢你的支持和回答!我不知道应该在哪里调用我的函数?在ViewDidDisplay或ViewWillDisplay的内部?但这两种方法在运行时都不起作用。因此,我调用了这个函数cellForRowAt indexPath和ViewDidAspect。也许我的问题是重新加载数据?再次感谢你的帮助
func controllerDidChangeContent(controller:NSFetchedResultsController){self.tabBarBadgeUpdater()self.tableView.endUpdates()}
,运行良好!它解决了我的问题!感谢
func controllerDidChangeContent(controller:NSFetchedResultsController){self.tabBarBadgeUpdater()self.tableView.endUpdates()}
并且工作得很好!它解决了我的问题!谢谢