如何正确更新 TabBarItem 的徽章值?
How to correctly update TabBarItem's badge value?
我有三个 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,而不是 "":
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 的出口来收集信息。
我有三个 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,而不是 "":
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 的出口来收集信息。