BadgeValue ne s'actualise pas

Bonjour à tous,

Je travaille avec une TabBar et je souhaite pouvoir changer le badge de l’un des onglets en fonction d’un nombre donné.
Dans l’ensemble, je pense être proche de la solution. Mais le nombre ne s’affiche pas dans ma TabBar.

L’idée c’est d’ajouter un nombre de produits au panier et que l’onglet panier affiche le nombre d’articles dedans.

J’ai donc fait ceci (en ayant bien affecté la classe CartTabBarItem à mon onglet dans mon storyboard) :

Dans mon ViewController (fonction à l’appui sur le bouton « Ajouter au panier »)

@IBAction func addToCartAction() {
        self._cartTabBarItem.setCartBadge(number: String(Int(self.uiProductsDetailsQuantityStepper.value)))
        self.resetQuantity()
    }

Dans mon CartTabBarItem.swift

func setCartBadge(number:String) {
        let item = self
        var actualBadgeValue = 0
        
        if let badgeValue = item.badgeValue {
            actualBadgeValue = Int(badgeValue)!
        }
        
        let newBadgeValue = actualBadgeValue + Int(number)!
        item.badgeValue = String(newBadgeValue)
        
        print("BadgeValue : \(String(describing: item.badgeValue!))")
        
    }

Dans mon print, la valeur du badge est correcte. Mais elle ne s’affecte pas à mon onglet.

Edit :
A noter que j’utilise un TabBarController et un NavigationController. De ce fait, il me semble que je ne peux pas utiliser le TabBarController pour gérer un item en particulier. (le tableau des items est à Nil). Du coup, j’ai créé la classe CartTabBarItem et je l’ai associée à mon item. Mais j’ai l’impression que c’est de ce côté là que j’ai un soucis.

Vous avez une piste pour moi ? :smiley:

Merci.

Hello,

Bon j’ai trouvé une solution, je ne sais pas si c’est idéal mais ça fonctionne (si vous voyez mieux, n’hésitez pas).

J’ai donc créé une class CartNavigationViewController assigné au navigationViewController de mon onglet panier. Et c’est dans cette classe que j’ai calé ma fonction setCartBadge(number). En l’adaptant un peu.

func setCartBadge(number:String) {
        let appDelegate  = UIApplication.shared.delegate as! AppDelegate
        let tabBarController = appDelegate.window!.rootViewController as! UITabBarController
        
        var actualBadgeValue = 0
        
        if let items = tabBarController.tabBar.items {
            for item in items {
                if item.tag == 1 {
                    if let badgeValue = item.badgeValue {
                        actualBadgeValue = Int(badgeValue)!
                    }
                    
                    let newBadgeValue = actualBadgeValue + Int(number)!
                    item.badgeValue = String(newBadgeValue)
                }
            }
        }
    }

Comme je disais, ça fonctionne. Mais je ne sais pas si appeler l’AppDelegate à cet endroit là est judicieux. Un avis ?

Pourquoi tu n’a pa crée directement une class UitabBarController ?

Je l’avais fait.

Mais la tabBar qui est dedans n’avait aucun item et je ne pouvais donc pas interagir sur un item en particulier.