2014-11-27 10 views
11

Mam kontroler nawigacyjny z 4 elementami paska kart. Każdy ma kontroler nawigacyjny w środku. Chcę mieć możliwość zmiany numeru znacznika czwartej karty, kiedy otrzymuję powiadomienie push, bez względu na to, w którym widoku lub karcie jestem. Muszę użyć automatycznego układu, więc nie mogę użyć żadnego programowego rozwiązania wewnątrz delegata aplikacji . Zacząłem projekt od jednego szablonu widoku.Aktualizuj znaczek nie wybranej zakładkiBarItem w Swift

Próbowałem przejść do żądanej karty, zmienić wartość znaczka i wrócić, ale oczywiście to nie zadziałało. Wygląda na to, że tabBarController zawiera tylko odniesienia do bieżącego elementu paska karty.

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

Odpowiedz

32

Nie trzeba wybierać tego indeksu, aby aktualizować wartość znaczka. Weź tablicę elementów paska kart. Wybierz element w indeksie, który chcesz zaktualizować, a następnie ustaw go jako wartość identyfikatora. Zobacz poniżej Zrobiłem dla czwartego elementu paska kart.

Swift 4.0 edit:

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

Schludnie i czysto! Dziękuję Ci bardzo! Widziałem, że w Obj-C zostało to zrobione przy użyciu objectAtIndex (index), ale nie mogłem znaleźć skąd go nazwać. Jeszcze raz dziękuję! – pinolo

+0

@Kampai, w jaki sposób należy to zmienić, aby zaktualizować ikonę znaczka w delegacie aplikacji? Nie mogę zrobić self.tabBarController z tego miejsca? – user2363025

+3

@ user2363025: Musisz pobrać 'rootViewController', aby zaktualizować znaczek z' AppDelegate'. W ten sposób 'let rootViewController = self.window? .rootViewController as! UITabBarController! let tabArray = rootViewController? .tabBar.items jako NSArray! let tabItem = tabArray.objectAtIndex (1) as! UITabBarItem tabItem.badgeValue = "34" ' – Kampai

6

Shorter:

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

I zawsze lepiej używać "jeśli pozwól": jeśli to możliwe 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 
    } 
} 

można nazwać tak:

self.tabBarController?.increaseBadge(indexOfTab: 3, num: "34") 
Powiązane problemy