2014-11-27 5 views
11

Ich habe einen Navigationscontroller mit 4 Tab-Leiste Elemente. Jeder hat einen Navigationscontroller im Inneren. Ich möchte in der Lage sein, die 4. Registerkarte Bar Abzeichen Nummer ändern, wenn ich Push-Benachrichtigung, egal in welcher Ansicht oder Registerkarte ich bin. Ich muss das Auto-Layout verwenden, so dass ich keine programmatische Lösung innerhalb der App Delegate verwenden kann . Ich habe das Projekt mit einer einzigen Ansichtsvorlage gestartet.Update Badge von nicht ausgewählten TabBarItem in Swift

Ich habe versucht, auf die gewünschte Registerkarte zu gehen, den Ausweiswert zu ändern und zurück zu kommen, aber natürlich hat es nicht funktioniert. Der TabBarController scheint nur Verweise auf das aktuelle Registerkartenelement zu haben.

var current = self.tabBarController?.selectedIndex 
    self.tabBarController?.selectedIndex = 3 
    self.navigationController?.tabBarItem.badgeValue = "34" 
    self.tabBarController?.selectedIndex = current! 

Antwort

32

Sie müssen diesen Index nicht auswählen, um den Ausweiswert zu aktualisieren. Nehmen Sie ein Array von Registerkartenelementen. Wählen Sie das Element im Index aus, das Sie aktualisieren möchten, und legen Sie dann den Wert für das Abzeichen fest. Siehe unten, was ich für den vierten Tab-Bar-Eintrag getan habe.

Swift 4.0 bearbeiten:

let tabArray = self.tabBarController?.tabBar.items as NSArray! 
let tabItem = tabArray?.object(at: 3) as! UITabBarItem 
tabItem.badgeValue = "34" 
+1

Ordentlich und sauber! Vielen Dank! Ich habe gesehen, dass es in Obj-C mit objectAtIndex (index) gemacht wurde, aber ich konnte nicht finden, von wo man es nennt. Danke nochmal! – pinolo

+0

@Kampai Wie müsste dies geändert werden, um das Badge-Icon-Update im App-Delegaten durchzuführen? Ich kann nicht von dort selbst.tabBarController machen? – user2363025

+3

@ user2363025: Sie brauchen 'rootViewController', um das Abzeichen von' AppDelegate' zu ​​aktualisieren. Lassen Sie rootViewController = self.window? .rootViewController as! UITabBarController! lassen Sie tabArray = rootViewController? .tabBar.items als NSArray! Lassen Sie tabItem = tabArray.objectAtIndex (1) as! UITabBarItem tabItem.badgeValue = "34" ' – Kampai

6

Shorter:

let tabItem = self.tabBarController?.tabBar.items![3] 
let tabItem.badgeValue = "34" 
+2

Und immer besser zu verwenden "wenn lassen": wenn lassen Sie TabItem = self.tabBarController? .tabBar.items! [3] { tabItem.badgeValue = 34 } – Adagio

2
extension UITabBarController { 
    func increaseBadge(indexOfTab: Int, num: String) { 
     let tabItem = tabBar.items![indexOfTab] 
     tabItem.badgeValue = num 
    } 
} 

und man es so nennen kann:

self.tabBarController?.increaseBadge(indexOfTab: 3, num: "34") 
Verwandte Themen