99
1010#import < objc/runtime.h>
1111
12- @interface RCTViewControllerAppearanceState : NSObject
13-
14- @property (nonatomic , strong , readonly ) NSHashTable <id<RCTViewControllerAppearanceListener>> *listeners;
15- @property (nonatomic , assign ) BOOL visible;
16-
17- @end
18-
19- @implementation RCTViewControllerAppearanceState
20-
21- - (instancetype )init
12+ static void RCTSetViewControllerIsVisible (UIViewController *viewController, BOOL isVisible)
2213{
23- if (self = [super init ]) {
24- _listeners = [NSHashTable weakObjectsHashTable ];
25- }
26- return self;
14+ objc_setAssociatedObject (
15+ viewController, @selector (reactViewControllerIsVisible ), @(isVisible), OBJC_ASSOCIATION_RETAIN_NONATOMIC );
2716}
2817
29- @end
30-
3118@implementation UIViewController (RCTViewControllerAppearance)
3219
33- - (RCTViewControllerAppearanceState *)reactViewControllerAppearanceState
20+ - (NSHashTable <id<RCTViewControllerAppearanceListener>> *)reactViewControllerAppearanceListeners
3421{
35- RCTViewControllerAppearanceState *state =
36- objc_getAssociatedObject (self, @selector (reactViewControllerAppearanceState ));
37- if (!state ) {
38- state = [RCTViewControllerAppearanceState new ];
22+ NSHashTable < id <RCTViewControllerAppearanceListener>> *listeners =
23+ objc_getAssociatedObject (self, @selector (reactViewControllerAppearanceListeners ));
24+ if (!listeners ) {
25+ listeners = [NSHashTable weakObjectsHashTable ];
3926 objc_setAssociatedObject (
40- self, @selector (reactViewControllerAppearanceState ), state , OBJC_ASSOCIATION_RETAIN_NONATOMIC );
27+ self, @selector (reactViewControllerAppearanceListeners ), listeners , OBJC_ASSOCIATION_RETAIN_NONATOMIC );
4128 }
42- return state ;
29+ return listeners ;
4330}
4431
4532- (BOOL )reactViewControllerIsVisible
4633{
47- return [self reactViewControllerAppearanceState ]. visible ;
34+ return [objc_getAssociatedObject ( self , @selector ( reactViewControllerIsVisible )) boolValue ] ;
4835}
4936
5037- (void )reactAddViewControllerAppearanceListener : (id <RCTViewControllerAppearanceListener>)listener
5138{
52- RCTViewControllerAppearanceState *state = [self reactViewControllerAppearanceState ];
53- [state.listeners addObject: listener];
39+ [[self reactViewControllerAppearanceListeners ] addObject: listener];
5440
55- if (state.visible && [listener respondsToSelector: @selector (reactViewControllerDidAppear:animated: )]) {
41+ if (self.reactViewControllerIsVisible &&
42+ [listener respondsToSelector: @selector (reactViewControllerDidAppear:animated: )]) {
5643 [listener reactViewControllerDidAppear: self animated: NO ];
5744 }
5845}
5946
6047- (void )reactRemoveViewControllerAppearanceListener : (id <RCTViewControllerAppearanceListener>)listener
6148{
62- [[self reactViewControllerAppearanceState ].listeners removeObject: listener];
49+ [[self reactViewControllerAppearanceListeners ] removeObject: listener];
6350}
6451
6552- (void )reactNotifyViewControllerDidAppear : (BOOL )animated
6653{
67- RCTViewControllerAppearanceState *state = [self reactViewControllerAppearanceState ];
68- state.visible = YES ;
54+ RCTSetViewControllerIsVisible (self, YES );
6955
70- for (id <RCTViewControllerAppearanceListener> listener in state. listeners .allObjects ) {
56+ for (id <RCTViewControllerAppearanceListener> listener in [ self reactViewControllerAppearanceListeners ] .allObjects ) {
7157 if ([listener respondsToSelector: @selector (reactViewControllerDidAppear:animated: )]) {
7258 [listener reactViewControllerDidAppear: self animated: animated];
7359 }
@@ -76,10 +62,9 @@ - (void)reactNotifyViewControllerDidAppear:(BOOL)animated
7662
7763- (void )reactNotifyViewControllerDidDisappear : (BOOL )animated
7864{
79- RCTViewControllerAppearanceState *state = [self reactViewControllerAppearanceState ];
80- state.visible = NO ;
65+ RCTSetViewControllerIsVisible (self, NO );
8166
82- for (id <RCTViewControllerAppearanceListener> listener in state. listeners .allObjects ) {
67+ for (id <RCTViewControllerAppearanceListener> listener in [ self reactViewControllerAppearanceListeners ] .allObjects ) {
8368 if ([listener respondsToSelector: @selector (reactViewControllerDidDisappear:animated: )]) {
8469 [listener reactViewControllerDidDisappear: self animated: animated];
8570 }
0 commit comments