使用 NotificationCenter 设置徽章值
Using NotificationCenter to set a badge value
我在我的 TabBarController class 中设置了一个通知中心观察器。
观察者调用一个名为 setMessageBadge 的方法,该方法将我设置为 0 的变量递增。此变量的目的是用作称为 MessageController 的特定选项卡栏的 badgeValue。每当调用观察者时,消息控制器选项卡都会收到当时变量的 badgeValue,直到用户选择该选项卡,然后 badgeValue 应该 重置。
//adds the observer. If it goes off then add one to the message badge and display it.
NotificationCenter.default.addObserver(self, selector: #selector(setMessageBadge), name: MESSAGE_NOTIFICATION, object: nil)
//Sets the badge for the message notifications
func setMessageBadge(){
//Check message tab
if let messageTab = self.tabBar.items?[3]{
//if selected
if self.tabBar.selectedItem != messageTab as UITabBarItem {
//Set the message badge value & color
messageBadge += 1
messageTab.badgeValue = "\(messageBadge)"
if #available(iOS 10.0, *) {
messageTab.badgeColor = ChatMessageCell.indexedColor
} else {
// Fallback on earlier versions
}
}
//If the messageTab is selected then the messageBadge should be reset to 0
//But its not. Something with the observer?
if self.tabBar.selectedItem == messageTab as UITabBarItem {
messageBadge = 0
}
}
}
在 MessageController 选项卡的 viewWillAppear 方法中,我删除了观察者,将徽章值设置为 nil,并将引用的变量设置回等于 0。
//View Will Appear
override func viewWillAppear(_ animated: Bool) {
//MessageController TAB
//Removes the badgeValue and resets messageBadge to 0 in an attempt to start the loop over.
if let thisTab = self.tabBarController?.tabBar.items?[3]{
NotificationCenter.default.removeObserver(self, name: MESSAGE_NOTIFICATION, object: nil)
thisTab.badgeValue = nil
tabBarControllerClass.removeMessageBadge()
print("This is from the tabBarClass: " + "\(tabBarControllerClass.messageBadge)")
}
}
我现在遇到的问题是,每当观察到通知时在 用户单击 MessageController 选项卡并且 badgeValue 设置为 nil 时,变量从它的最后一个继续点而不是再次从 0 开始,即使我将它设置为 0。例如,如果有两个通知,则 badgeValue 应该等于 2,直到用户单击屏幕。当用户点击屏幕时,它应该等于 0。如果用户收到另一个通知,它应该从 0 开始并转到 1,但相反,它转到 3。
问题是您的 UITabBarController
中的 messageBadge
属性 没有在适当的时候重置。我假设您想在选择选项卡时重置它。最直接的方法是实现 UITabBarController
的 UITabBarControllerDelegate
(您可以将其设置为自身)。然后,将清除值的代码移动到委托的 didSelect
方法中。它可以看起来像这样:
func tabBarController(_ tabBarController: UITabBarController,
didSelect viewController: UIViewController)
{
if self.tabBar.selectedItem == messageTab as UITabBarItem {
messageBadge = 0
}
}
我在我的 TabBarController class 中设置了一个通知中心观察器。 观察者调用一个名为 setMessageBadge 的方法,该方法将我设置为 0 的变量递增。此变量的目的是用作称为 MessageController 的特定选项卡栏的 badgeValue。每当调用观察者时,消息控制器选项卡都会收到当时变量的 badgeValue,直到用户选择该选项卡,然后 badgeValue 应该 重置。
//adds the observer. If it goes off then add one to the message badge and display it.
NotificationCenter.default.addObserver(self, selector: #selector(setMessageBadge), name: MESSAGE_NOTIFICATION, object: nil)
//Sets the badge for the message notifications
func setMessageBadge(){
//Check message tab
if let messageTab = self.tabBar.items?[3]{
//if selected
if self.tabBar.selectedItem != messageTab as UITabBarItem {
//Set the message badge value & color
messageBadge += 1
messageTab.badgeValue = "\(messageBadge)"
if #available(iOS 10.0, *) {
messageTab.badgeColor = ChatMessageCell.indexedColor
} else {
// Fallback on earlier versions
}
}
//If the messageTab is selected then the messageBadge should be reset to 0
//But its not. Something with the observer?
if self.tabBar.selectedItem == messageTab as UITabBarItem {
messageBadge = 0
}
}
}
在 MessageController 选项卡的 viewWillAppear 方法中,我删除了观察者,将徽章值设置为 nil,并将引用的变量设置回等于 0。
//View Will Appear
override func viewWillAppear(_ animated: Bool) {
//MessageController TAB
//Removes the badgeValue and resets messageBadge to 0 in an attempt to start the loop over.
if let thisTab = self.tabBarController?.tabBar.items?[3]{
NotificationCenter.default.removeObserver(self, name: MESSAGE_NOTIFICATION, object: nil)
thisTab.badgeValue = nil
tabBarControllerClass.removeMessageBadge()
print("This is from the tabBarClass: " + "\(tabBarControllerClass.messageBadge)")
}
}
我现在遇到的问题是,每当观察到通知时在 用户单击 MessageController 选项卡并且 badgeValue 设置为 nil 时,变量从它的最后一个继续点而不是再次从 0 开始,即使我将它设置为 0。例如,如果有两个通知,则 badgeValue 应该等于 2,直到用户单击屏幕。当用户点击屏幕时,它应该等于 0。如果用户收到另一个通知,它应该从 0 开始并转到 1,但相反,它转到 3。
问题是您的 UITabBarController
中的 messageBadge
属性 没有在适当的时候重置。我假设您想在选择选项卡时重置它。最直接的方法是实现 UITabBarController
的 UITabBarControllerDelegate
(您可以将其设置为自身)。然后,将清除值的代码移动到委托的 didSelect
方法中。它可以看起来像这样:
func tabBarController(_ tabBarController: UITabBarController,
didSelect viewController: UIViewController)
{
if self.tabBar.selectedItem == messageTab as UITabBarItem {
messageBadge = 0
}
}