Skip to content

Instantly share code, notes, and snippets.

@sgl0v
Created October 6, 2019 15:28
Show Gist options
  • Save sgl0v/fa0e7e73bad572cabc7d06c939a50a6e to your computer and use it in GitHub Desktop.
Save sgl0v/fa0e7e73bad572cabc7d06c939a50a6e to your computer and use it in GitHub Desktop.
Backward compatible Dark Mode on iOS - ThemeProvider.swift
class ThemeProvider {
static let shared = ThemeProvider()
var theme: Theme {
didSet {
UserDefaults.standard.set(theme == .dark, forKey: "isDark")
notifyObservers()
}
}
private var observers: NSHashTable<AnyObject> = NSHashTable.weakObjects()
private init() {
self.theme = UserDefaults.standard.bool(forKey: "isDark") ? .dark : .light
}
func toggleTheme() {
theme = theme == .light ? .dark : .light
}
func register<Observer: Themeable>(observer: Observer) {
observer.apply(theme: theme)
self.observers.add(observer)
}
private func notifyObservers() {
DispatchQueue.main.async {
self.observers.allObjects
.compactMap({ $0 as? Themeable })
.forEach({ $0.apply(theme: self.theme) })
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment