Created
February 15, 2021 09:34
-
-
Save prafullakumar/f168715aa59ac1d2f07870119c71da53 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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