diff --git a/React/Views/RCTTabBar.h b/React/Views/RCTTabBar.h index 5f866a27ba51dc..d2f1c1e7a5de0e 100644 --- a/React/Views/RCTTabBar.h +++ b/React/Views/RCTTabBar.h @@ -19,4 +19,6 @@ @property (nonatomic, assign) UIBarStyle barStyle; #endif +- (void)uiManagerDidPerformMounting; + @end diff --git a/React/Views/RCTTabBar.m b/React/Views/RCTTabBar.m index 1f6d29d7a090b7..f9d297d567dfeb 100644 --- a/React/Views/RCTTabBar.m +++ b/React/Views/RCTTabBar.m @@ -73,7 +73,7 @@ - (void)removeReactSubview:(RCTTabBarItem *)subview - (void)didUpdateReactSubviews { - // Do nothing, as subviews are managed by `reactBridgeDidFinishTransaction` + // Do nothing, as subviews are managed by `uiManagerDidPerformMounting` } - (void)layoutSubviews @@ -83,7 +83,7 @@ - (void)layoutSubviews _tabController.view.frame = self.bounds; } -- (void)reactBridgeDidFinishTransaction +- (void)uiManagerDidPerformMounting { // we can't hook up the VC hierarchy in 'init' because the subviews aren't // hooked up yet, so we do it on demand here whenever a transaction has finished diff --git a/React/Views/RCTTabBarManager.m b/React/Views/RCTTabBarManager.m index 471a875979021d..f8e98854d05590 100644 --- a/React/Views/RCTTabBarManager.m +++ b/React/Views/RCTTabBarManager.m @@ -11,6 +11,8 @@ #import "RCTBridge.h" #import "RCTTabBar.h" +#import "RCTUIManager.h" +#import "RCTUIManagerObserverCoordinator.h" @implementation RCTConvert (UITabBar) @@ -22,13 +24,39 @@ @implementation RCTConvert (UITabBar) @end +@interface RCTTabBarManager () + +@end + @implementation RCTTabBarManager +{ + // The main thread only. + NSHashTable *_viewRegistry; +} + +- (void)setBridge:(RCTBridge *)bridge +{ + [super setBridge:bridge]; + + [self.bridge.uiManager.observerCoordinator addObserver:self]; +} + +- (void)invalidate +{ + [self.bridge.uiManager.observerCoordinator removeObserver:self]; +} RCT_EXPORT_MODULE() - (UIView *)view { - return [RCTTabBar new]; + if (!_viewRegistry) { + _viewRegistry = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]; + } + + RCTTabBar *view = [RCTTabBar new]; + [_viewRegistry addObject:view]; + return view; } RCT_EXPORT_VIEW_PROPERTY(unselectedTintColor, UIColor) @@ -41,4 +69,15 @@ - (UIView *)view RCT_EXPORT_VIEW_PROPERTY(itemPositioning, UITabBarItemPositioning) RCT_EXPORT_VIEW_PROPERTY(unselectedItemTintColor, UIColor) +#pragma mark - RCTUIManagerObserver + +- (void)uiManagerDidPerformMounting:(__unused RCTUIManager *)manager +{ + RCTExecuteOnMainQueue(^{ + for (RCTTabBar *view in self->_viewRegistry) { + [view uiManagerDidPerformMounting]; + } + }); +} + @end