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()}
并且工作得很好!它解决了我的问题!谢谢