From a3922f84815a80b094416b4ce2bee342f21890a6 Mon Sep 17 00:00:00 2001 From: yogevbd Date: Tue, 4 Dec 2018 14:09:15 +0200 Subject: [PATCH] setRoot on main application window - fix setRoot on iPad --- lib/ios/RNNBridgeManager.m | 2 +- lib/ios/RNNCommandsHandler.h | 2 +- lib/ios/RNNCommandsHandler.m | 18 ++++--- .../RNNCommandsHandlerTest.m | 54 +++++++++++++------ 4 files changed, 49 insertions(+), 27 deletions(-) diff --git a/lib/ios/RNNBridgeManager.m b/lib/ios/RNNBridgeManager.m index 793869917ea..f9e06ffbc8f 100644 --- a/lib/ios/RNNBridgeManager.m +++ b/lib/ios/RNNBridgeManager.m @@ -76,7 +76,7 @@ - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { id rootViewCreator = [[RNNReactRootViewCreator alloc] initWithBridge:bridge]; RNNControllerFactory *controllerFactory = [[RNNControllerFactory alloc] initWithRootViewCreator:rootViewCreator eventEmitter:eventEmitter andBridge:bridge]; - _commandsHandler = [[RNNCommandsHandler alloc] initWithStore:_store controllerFactory:controllerFactory eventEmitter:eventEmitter stackManager:[RNNNavigationStackManager new] modalManager:[RNNModalManager new] overlayManager:[RNNOverlayManager new]]; + _commandsHandler = [[RNNCommandsHandler alloc] initWithStore:_store controllerFactory:controllerFactory eventEmitter:eventEmitter stackManager:[RNNNavigationStackManager new] modalManager:[RNNModalManager new] overlayManager:[RNNOverlayManager new] mainWindow:[UIApplication sharedApplication].keyWindow]; RNNBridgeModule *bridgeModule = [[RNNBridgeModule alloc] initWithCommandsHandler:_commandsHandler]; return [@[bridgeModule,eventEmitter] arrayByAddingObjectsFromArray:[self extraModulesFromDelegate]]; diff --git a/lib/ios/RNNCommandsHandler.h b/lib/ios/RNNCommandsHandler.h index 1873bc6dbff..10309d82a48 100644 --- a/lib/ios/RNNCommandsHandler.h +++ b/lib/ios/RNNCommandsHandler.h @@ -9,7 +9,7 @@ @interface RNNCommandsHandler : NSObject -- (instancetype)initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory eventEmitter:(RNNEventEmitter *)eventEmitter stackManager:(RNNNavigationStackManager *)stackManager modalManager:(RNNModalManager *)modalManager overlayManager:(RNNOverlayManager *)overlayManager; +- (instancetype)initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory eventEmitter:(RNNEventEmitter *)eventEmitter stackManager:(RNNNavigationStackManager *)stackManager modalManager:(RNNModalManager *)modalManager overlayManager:(RNNOverlayManager *)overlayManager mainWindow:(UIWindow *)mainWindow; - (void)setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion; diff --git a/lib/ios/RNNCommandsHandler.m b/lib/ios/RNNCommandsHandler.m index 3ef745f2274..04932c32816 100644 --- a/lib/ios/RNNCommandsHandler.m +++ b/lib/ios/RNNCommandsHandler.m @@ -34,9 +34,10 @@ @implementation RNNCommandsHandler { RNNOverlayManager* _overlayManager; RNNNavigationStackManager* _stackManager; RNNEventEmitter* _eventEmitter; + UIWindow* _mainWindow; } -- (instancetype)initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory eventEmitter:(RNNEventEmitter *)eventEmitter stackManager:(RNNNavigationStackManager *)stackManager modalManager:(RNNModalManager *)modalManager overlayManager:(RNNOverlayManager *)overlayManager { +- (instancetype)initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory eventEmitter:(RNNEventEmitter *)eventEmitter stackManager:(RNNNavigationStackManager *)stackManager modalManager:(RNNModalManager *)modalManager overlayManager:(RNNOverlayManager *)overlayManager mainWindow:(UIWindow *)mainWindow { self = [super init]; _store = store; _controllerFactory = controllerFactory; @@ -45,6 +46,7 @@ - (instancetype)initWithStore:(RNNStore*)store controllerFactory:(RNNControllerF _modalManager.delegate = self; _stackManager = stackManager; _overlayManager = overlayManager; + _mainWindow = mainWindow; return self; } @@ -54,12 +56,12 @@ - (void)setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)c [self assertReady]; [_modalManager dismissAllModalsAnimated:NO]; - [_store removeAllComponentsFromWindow:UIApplication.sharedApplication.delegate.window]; + [_store removeAllComponentsFromWindow:_mainWindow]; UIViewController *vc = [_controllerFactory createLayout:layout[@"root"] saveToStore:_store]; - [UIApplication sharedApplication].windows.firstObject.rootViewController = vc; - + _mainWindow.rootViewController = vc; + [_eventEmitter sendOnNavigationCommandCompletion:setRoot params:@{@"layout": layout}]; completion(); } @@ -75,7 +77,7 @@ - (void)mergeOptions:(NSString*)componentId options:(NSDictionary*)mergeOptions [vc overrideOptions:newOptions]; [vc mergeOptions:newOptions]; - + [CATransaction commit]; } } @@ -103,8 +105,8 @@ - (void)push:(NSString*)componentId layout:(NSDictionary*)layout completion:(RNN if([vc isKindOfClass:[RNNRootViewController class]]) { RNNRootViewController* rootVc = (RNNRootViewController*)vc; rootVc.previewController = newVc; - - rootVc.previewCallback = ^(UIViewController *vcc) { + + rootVc.previewCallback = ^(UIViewController *vcc) { RNNRootViewController* rvc = (RNNRootViewController*)vcc; [self->_eventEmitter sendOnPreviewCompleted:componentId previewComponentId:newVc.layoutInfo.componentId]; if ([newVc.resolveOptions.preview.commit getWithDefaultValue:NO]) { @@ -131,7 +133,7 @@ - (void)push:(NSString*)componentId layout:(NSDictionary*)layout completion:(RNN if (newVc.resolveOptions.preview.width.hasValue || newVc.resolveOptions.preview.height.hasValue) { newVc.preferredContentSize = size; } - + RCTExecuteOnMainQueue(^{ UIView *view = [[ReactNativeNavigation getBridge].uiManager viewForReactTag:newVc.resolveOptions.preview.reactTag.get]; [rootVc registerForPreviewingWithDelegate:(id)rootVc sourceView:view]; diff --git a/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m b/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m index 6657f68567b..eb8d11e107f 100644 --- a/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m +++ b/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m @@ -32,6 +32,7 @@ @interface RNNCommandsHandlerTest : XCTestCase @property (nonatomic, strong) RNNRootViewController* vc2; @property (nonatomic, strong) RNNRootViewController* vc3; @property (nonatomic, strong) MockUINavigationController* nvc; +@property (nonatomic, strong) id mainWindow; @property (nonatomic, strong) id controllerFactory; @property (nonatomic, strong) id overlayManager; @property (nonatomic, strong) id eventEmmiter; @@ -42,11 +43,12 @@ @implementation RNNCommandsHandlerTest - (void)setUp { [super setUp]; + self.mainWindow = [OCMockObject partialMockForObject:[UIWindow new]]; self.store = [OCMockObject partialMockForObject:[[RNNStore alloc] init]]; self.eventEmmiter = [OCMockObject partialMockForObject:[RNNEventEmitter new]]; self.overlayManager = [OCMockObject partialMockForObject:[RNNOverlayManager new]]; self.controllerFactory = [OCMockObject partialMockForObject:[[RNNControllerFactory alloc] initWithRootViewCreator:nil eventEmitter:self.eventEmmiter andBridge:nil]]; - self.uut = [[RNNCommandsHandler alloc] initWithStore:self.store controllerFactory:self.controllerFactory eventEmitter:self.eventEmmiter stackManager:[RNNNavigationStackManager new] modalManager:[RNNModalManager new] overlayManager:self.overlayManager]; + self.uut = [[RNNCommandsHandler alloc] initWithStore:self.store controllerFactory:self.controllerFactory eventEmitter:self.eventEmmiter stackManager:[RNNNavigationStackManager new] modalManager:[RNNModalManager new] overlayManager:self.overlayManager mainWindow:self.mainWindow]; self.vc1 = [RNNRootViewController new]; self.vc2 = [RNNRootViewController new]; self.vc3 = [RNNRootViewController new]; @@ -72,30 +74,30 @@ - (void)testAssertReadyForEachMethodThrowsExceptoins { -(NSArray*) getPublicMethodNamesForObject:(NSObject*)obj{ NSMutableArray* skipMethods = [NSMutableArray new]; - - [skipMethods addObject:@"initWithStore:controllerFactory:eventEmitter:stackManager:modalManager:overlayManager:"]; + + [skipMethods addObject:@"initWithStore:controllerFactory:eventEmitter:stackManager:modalManager:overlayManager:mainWindow:"]; [skipMethods addObject:@"assertReady"]; [skipMethods addObject:@"removePopedViewControllers:"]; [skipMethods addObject:@".cxx_destruct"]; [skipMethods addObject:@"dismissedModal:"]; [skipMethods addObject:@"dismissedMultipleModals:"]; - + NSMutableArray* result = [NSMutableArray new]; - + // count and names: int i=0; unsigned int mc = 0; Method * mlist = class_copyMethodList(object_getClass(obj), &mc); - + for(i=0; i