diff --git a/React/Views/RCTNavigator.h b/React/Views/RCTNavigator.h index c507c5391..88ee69820 100644 --- a/React/Views/RCTNavigator.h +++ b/React/Views/RCTNavigator.h @@ -31,4 +31,6 @@ */ - (BOOL)requestSchedulingJavaScriptNavigation; +- (void)uiManagerDidPerformMounting; + @end diff --git a/React/Views/RCTNavigator.m b/React/Views/RCTNavigator.m index 0fde4515f..fdbdcab78 100644 --- a/React/Views/RCTNavigator.m +++ b/React/Views/RCTNavigator.m @@ -466,7 +466,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder) - (void)didUpdateReactSubviews { - // Do nothing, as subviews are managed by `reactBridgeDidFinishTransaction` + // Do nothing, as subviews are managed by `uiManagerDidPerformMounting` } - (void)layoutSubviews @@ -510,7 +510,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder) return superview ?: self.reactNavSuperviewLink; } -- (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 diff --git a/React/Views/RCTNavigatorManager.m b/React/Views/RCTNavigatorManager.m index ee44a7750..dee418749 100644 --- a/React/Views/RCTNavigatorManager.m +++ b/React/Views/RCTNavigatorManager.m @@ -13,15 +13,42 @@ #import "RCTConvert.h" #import "RCTNavigator.h" #import "RCTUIManager.h" +#import "RCTUIManagerObserverCoordinator.h" #import "UIView+React.h" +@interface RCTNavigatorManager () + +@end + @implementation RCTNavigatorManager +{ + // 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 [[RCTNavigator alloc] initWithBridge:self.bridge]; + if (!_viewRegistry) { + _viewRegistry = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory]; + } + + RCTNavigator *view = [[RCTNavigator alloc] initWithBridge:self.bridge]; + [_viewRegistry addObject:view]; + return view; } RCT_EXPORT_VIEW_PROPERTY(requestedTopOfStack, NSInteger) @@ -44,4 +71,15 @@ RCT_EXPORT_METHOD(requestSchedulingJavaScriptNavigation:(nonnull NSNumber *)reac }]; } +#pragma mark - RCTUIManagerObserver + +- (void)uiManagerDidPerformMounting:(__unused RCTUIManager *)manager +{ + RCTExecuteOnMainQueue(^{ + for (RCTNavigator *view in self->_viewRegistry) { + [view uiManagerDidPerformMounting]; + } + }); +} + @end