使用NotificationCenter设置徽章值



我在我的tabbarcontroller类中设置了一个通知中心观察者。观察者调用一个名为SetMessageBadge的方法,该方法将我设置为0的变量增加了。该变量的目的是作为称为MessageController的特定标签栏的徽章。每当调用观察者时,"消息控制器"选项卡将接收到当时的任何变量的徽章值,直到用户选择该选项卡,然后badgevalue 应该 reset。

//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选项卡和徽章,并将徽章设置为nil,该变量从最后一个点开始,而不是从其上点开始0再次将其设置为0。例如,如果有两个通知,则徽章值应等于2,直到用户单击屏幕为止。当用户单击屏幕时,它应等于0。如果用户收到另一个通知,则应从0开始并转到1,但转到3。

问题是您在UITabBarController中的messageBadge属性在适当的时候并不重置。我假设您要在选定选项卡时将其重置。最直接的方法是实现UITabBarControllerUITabBarControllerDelegate(您可以将其设置为自身(。然后,移动您拥有的代码将值清除到委托的didSelect方法中。它看起来像这样:

func tabBarController(_ tabBarController: UITabBarController, 
                     didSelect viewController: UIViewController)
{
    if self.tabBar.selectedItem == messageTab as UITabBarItem {
        messageBadge = 0
    }
}

最新更新