Comments (3)
self.observe(theme: \Theme.view)
should only ever be called once within the lifetime of an object (i.e. self
here).
Handling Disposable
is only necessary for the class-level API.
from gestalt.
i tried on demo project with only two controllers this is logs
*** 0x0000000103106690 Firs view controller regiseter for theme first theme
*** 0x0000000103121190 Second view controller regiseter for theme second theme
*** 0x0000000103121190 Second view controller deinit
*** 0x0000000103113540 Second view controller regiseter for theme second theme
*** 0x0000000103113540 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x0000000103113540 Second view controller regiseter for theme second theme
*** 0x0000000103113540 Second view controller deinit
As you can see few times second view contoller has same memory address
App delegate:
window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = UINavigationController(rootViewController: FirstViewController()) window?.makeKeyAndVisible() ThemeManager.default.theme = ApplicationTheme.light
First view controller:
`class FirstViewController: UIViewController, Themeable {
var pushButton = UIButton(frame: CGRect(x: 100, y: 500, width: 100, height: 50))
override func viewDidLoad() {
super.viewDidLoad()
pushButton.setTitle("push", for: .normal)
pushButton.setTitleColor(.black, for: .normal)
pushButton.addTarget(self, action: #selector(onPush), for: .touchUpInside)
view.addSubview(pushButton)
setThemeObserve()
}
typealias Theme = FirstVCTheme
func setThemeObserve() {
self.observe(theme: \ApplicationTheme.firstTheme)
print("*** \(Unmanaged.passUnretained(self).toOpaque()) Firs view controller regiseter for theme first theme")
}
func apply(theme: Theme) {
view.backgroundColor = theme.backgroundColor
}
@objc func onPush() {
self.navigationController?.pushViewController(SecondViewController(), animated: true)
}
}`
Second view controller: `class SecondViewController: UIViewController, Themeable {
override func viewDidLoad() {
super.viewDidLoad()
setThemeObserve()
}
deinit {
print("*** \(Unmanaged.passUnretained(self).toOpaque()) Second view controller deinit")
}
typealias Theme = SecondVCTheme
func setThemeObserve() {
self.observe(theme: \ApplicationTheme.secondTheme)
print("*** \(Unmanaged.passUnretained(self).toOpaque()) Second view controller regiseter for theme second theme")
}
func apply(theme: Theme) {
view.backgroundColor = theme.backgroundColor
}
}`
AplicationTheme:
`enum ThemeType: Int {
case light
case dark
}
struct ApplicationTheme: Theme {
let firstTheme: FirstVCTheme
let secondTheme: SecondVCTheme
static let light = ApplicationTheme(firstTheme: FirstVCTheme(type: .light),
secondTheme: SecondVCTheme(type: .light))
static let dark = ApplicationTheme(firstTheme: FirstVCTheme(type: .dark),
secondTheme: SecondVCTheme(type: .dark))
}
struct SecondVCTheme: Theme {
let backgroundColor: UIColor
init(type: ThemeType) {
switch type {
case .light:
backgroundColor = .cyan
case .dark:
backgroundColor = .brown
}
}
}
struct FirstVCTheme: Theme {
let backgroundColor: UIColor
init(type: ThemeType) {
switch type {
case .light:
backgroundColor = .red
case .dark:
backgroundColor = .yellow
}
}
}`
from gestalt.
If you get "Detected redundant observation"
with func viewDidLoad()
, then try moving self.observe(theme: …)
into the initializer instead.
from gestalt.
Related Issues (13)
- MPL License and the App Store HOT 2
- Request for Changelog
- Invalid Bundle Version String HOT 1
- Cocoapods HOT 3
- Migration from 1.x to 2.0.0
- How To Observe Themes Dynamically? HOT 1
- Window hack not extension safe HOT 3
- Swift 5 support HOT 1
- Unsubscribe from theme update? HOT 1
- Changing appearance causes broken keyboard/toolbar HOT 4
- UIAppearance not working. HOT 1
- Initial theme apply? HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gestalt.