Skip to content

Instantly share code, notes, and snippets.

@prafullakumar
Created February 15, 2021 09:34
Show Gist options
  • Save prafullakumar/f168715aa59ac1d2f07870119c71da53 to your computer and use it in GitHub Desktop.
Save prafullakumar/f168715aa59ac1d2f07870119c71da53 to your computer and use it in GitHub Desktop.
import SwiftUI
final class BadgeUpdater {
var badgeNumber: Int { ///update on change of badge value
didSet {
self.tabViewController?.viewControllers?[badgeIndex].tabBarItem.badgeValue = "\(self.badgeNumber)"
}
}
var badgeIndex: Int { ///update on change of index
didSet {
self.tabViewController?.viewControllers?[badgeIndex].tabBarItem.badgeValue = "\(self.badgeNumber)"
}
}
weak var tabViewController: UITabBarController?
var observar: NSKeyValueObservation?
init(badgeNumber: Int, badgeIndex: Int) {
self.badgeNumber = badgeNumber
self.badgeIndex = badgeIndex
}
func onViewAppear() {
if let rootTabVC = UIApplication.shared.windows.filter({$0.isKeyWindow}).first?.rootViewController?.children.first as? UITabBarController { //get your tab controller from window
self.tabViewController = rootTabVC
self.tabViewController?.viewControllers?[badgeIndex].tabBarItem.badgeValue = "\(self.badgeNumber)"
self.observar = self.tabViewController?.viewControllers?[badgeIndex].observe(\.tabBarItem, options: .new, changeHandler: { [weak self] (vc, valueWrapper) in
guard let self = self else { return }
if (self.badgeNumber != 0) && valueWrapper.newValue??.badgeValue == nil {
//force block tab badgeNumber reset
vc.tabBarItem.badgeValue = "\(self.badgeNumber)"
}
})
}
}
}
struct ContentView: View {
let badgeUpdater = BadgeUpdater(badgeNumber: 10, badgeIndex: 1)
@State private var selectedTab = 0
@State private var name = ""
var body: some View {
TabView(selection: $selectedTab) {
TextField("Enter your name", text: $name)
.padding()
.tabItem {
Label("Menu", systemImage: "list.dash")
}.tag(0)
Text("Second View")
.tabItem {
Label("Order", systemImage: "square.and.pencil")
}.tag(1)
}
.onAppear() {
badgeUpdater.onViewAppear()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment