yogevbd il y a 6 ans
Parent
révision
64d7888161

+ 1
- 1
e2e/ScreenStack.test.js Voir le fichier

@@ -99,7 +99,7 @@ describe('screen stack', () => {
99 99
     await expect(elementByLabel('Stack Position: 2')).toBeVisible();
100 100
   });
101 101
 
102
-  it(':android: push to stack with static id from SideMenu', async () => {
102
+  it('push to stack with static id from SideMenu', async () => {
103 103
     await elementById(testIDs.TAB_BASED_APP_SIDE_BUTTON).tap();
104 104
     await elementById(testIDs.SHOW_LEFT_SIDE_MENU_BUTTON).tap();
105 105
     await elementById(testIDs.LEFT_SIDE_MENU_PUSH_BUTTON).tap();

+ 0
- 2
lib/ios/RNNNavigationStackManager.h Voir le fichier

@@ -4,8 +4,6 @@
4 4
 
5 5
 @interface RNNNavigationStackManager : NSObject
6 6
 
7
-@property (nonatomic, strong) UIViewController* fromVC;
8
-@property (nonatomic, strong) RNNRootViewController* toVC;
9 7
 @property (nonatomic) int loadCount;
10 8
 -(instancetype)initWithStore:(RNNStore*)store;
11 9
 

+ 42
- 28
lib/ios/RNNNavigationStackManager.m Voir le fichier

@@ -2,9 +2,14 @@
2 2
 #import "RNNRootViewController.h"
3 3
 #import "RNNAnimator.h"
4 4
 #import "RNNErrorHandler.h"
5
-
5
+#import "RNNNavigationController.h"
6 6
 
7 7
 dispatch_queue_t RCTGetUIManagerQueue(void);
8
+@interface RNNNavigationStackManager()
9
+@property (nonatomic, strong) RNNNavigationController* nvc;
10
+@property (nonatomic, strong) RNNRootViewController* toVC;
11
+@end
12
+
8 13
 @implementation RNNNavigationStackManager {
9 14
 	RNNStore *_store;
10 15
 	RNNTransitionCompletionBlock _completionBlock;
@@ -17,9 +22,9 @@ dispatch_queue_t RCTGetUIManagerQueue(void);
17 22
 }
18 23
 
19 24
 -(void)push:(UIViewController<RNNRootViewProtocol> *)newTop onTop:(NSString *)componentId completion:(RNNTransitionCompletionBlock)completion rejection:(RCTPromiseRejectBlock)rejection {
20
-	UIViewController *vc = [_store findComponentForId:componentId];
21
-	[self preparePush:newTop onTopVC:vc completion:completion];
22
-	[self assertNavigationControllerExist:vc reject:rejection];
25
+	RNNNavigationController *nvc = [self getComponentStack:componentId];
26
+	[self assertNavigationControllerExist:nvc reject:rejection];
27
+	[self preparePush:newTop onTopVC:nvc completion:completion];
23 28
 	if ([newTop isCustomViewController]) {
24 29
 		[self pushAfterLoad:nil];
25 30
 	} else {
@@ -27,16 +32,16 @@ dispatch_queue_t RCTGetUIManagerQueue(void);
27 32
 	}
28 33
 }
29 34
 
30
--(void)preparePush:(UIViewController<RNNRootViewProtocol> *)newTop onTopVC:(UIViewController*)vc completion:(RNNTransitionCompletionBlock)completion {
35
+-(void)preparePush:(UIViewController<RNNRootViewProtocol> *)newTop onTopVC:(RNNNavigationController*)nvc completion:(RNNTransitionCompletionBlock)completion {
31 36
 	self.toVC = (RNNRootViewController*)newTop;
32
-	self.fromVC = vc;
37
+	self.nvc = nvc;
33 38
 	
34 39
 	
35 40
 	if (self.toVC.options.animations.push.hasCustomAnimation || self.toVC.isCustomTransitioned) {
36
-		vc.navigationController.delegate = newTop;
41
+		nvc.delegate = newTop;
37 42
 	} else {
38
-		vc.navigationController.delegate = nil;
39
-		self.fromVC.navigationController.interactivePopGestureRecognizer.delegate = nil;
43
+		nvc.delegate = nil;
44
+		nvc.interactivePopGestureRecognizer.delegate = nil;
40 45
 	}
41 46
 	
42 47
 	_completionBlock = completion;
@@ -59,18 +64,19 @@ dispatch_queue_t RCTGetUIManagerQueue(void);
59 64
 		}
60 65
 	}];
61 66
 	
62
-	[[self.fromVC navigationController] pushViewController:self.toVC animated:self.toVC.options.animations.push.enable];
67
+	[self.nvc pushViewController:self.toVC animated:self.toVC.options.animations.push.enable];
63 68
 	[CATransaction commit];
64 69
 	
65 70
 	self.toVC = nil;
66
-	self.fromVC.navigationController.interactivePopGestureRecognizer.delegate = nil;
67
-	self.fromVC = nil;
71
+	self.nvc.interactivePopGestureRecognizer.delegate = nil;
72
+	self.nvc = nil;
68 73
 }
69 74
 
70 75
 -(void)pop:(NSString *)componentId withTransitionOptions:(RNNAnimationOptions *)transitionOptions rejection:(RCTPromiseRejectBlock)rejection {
71 76
 	RNNRootViewController* vc = (RNNRootViewController*)[_store findComponentForId:componentId];
72
-	[self assertNavigationControllerExist:vc reject:rejection];
73
-	UINavigationController* nvc = [vc navigationController];
77
+	UINavigationController* nvc = [self getComponentStack:componentId];
78
+	[self assertNavigationControllerExist:nvc reject:rejection];
79
+	
74 80
 	if ([nvc topViewController] == vc) {
75 81
 		if (vc.options.animations.pop) {
76 82
 			nvc.delegate = vc;
@@ -89,28 +95,27 @@ dispatch_queue_t RCTGetUIManagerQueue(void);
89 95
 
90 96
 -(void)popTo:(NSString*)componentId rejection:(RCTPromiseRejectBlock)rejection {
91 97
 	RNNRootViewController *vc = (RNNRootViewController*)[_store findComponentForId:componentId];
92
-	[self assertNavigationControllerExist:vc reject:rejection];
93
-	if (vc) {
94
-		UINavigationController *nvc = [vc navigationController];
95
-		if(nvc) {
96
-			NSArray *poppedVCs = [nvc popToViewController:vc animated:vc.options.animations.pop.enable];
97
-			[self removePopedViewControllers:poppedVCs];
98
-		}
98
+	RNNNavigationController *nvc = [self getComponentStack:componentId];
99
+	[self assertNavigationControllerExist:nvc reject:rejection];
100
+	
101
+	if (vc && nvc) {
102
+		NSArray *poppedVCs = [nvc popToViewController:vc animated:vc.options.animations.pop.enable];
103
+		[self removePopedViewControllers:poppedVCs];
99 104
 	}
100 105
 }
101 106
 
102 107
 -(void)popToRoot:(NSString*)componentId rejection:(RCTPromiseRejectBlock)rejection {
103 108
 	RNNRootViewController *vc = (RNNRootViewController*)[_store findComponentForId:componentId];
104
-	[self assertNavigationControllerExist:vc reject:rejection];
105
-	UINavigationController* nvc = [vc navigationController];
109
+	RNNNavigationController *nvc = [self getComponentStack:componentId];
110
+	[self assertNavigationControllerExist:nvc reject:rejection];
106 111
 	NSArray* poppedVCs = [nvc popToRootViewControllerAnimated:vc.options.animations.pop.enable];
107 112
 	[self removePopedViewControllers:poppedVCs];
108 113
 }
109 114
 
110 115
 -(void)setStackRoot:(UIViewController<RNNRootViewProtocol> *)newRoot fromComponent:(NSString *)componentId completion:(RNNTransitionCompletionBlock)completion rejection:(RCTPromiseRejectBlock)rejection {
111
-	UIViewController* vc = [_store findComponentForId:componentId];
112
-	[self assertNavigationControllerExist:vc reject:rejection];
113
-	UINavigationController* nvc = [vc navigationController];
116
+	RNNNavigationController* nvc = [self getComponentStack:componentId];
117
+
118
+	[self assertNavigationControllerExist:nvc reject:rejection];
114 119
 	
115 120
 	[CATransaction begin];
116 121
 	[CATransaction setCompletionBlock:^{
@@ -124,13 +129,22 @@ dispatch_queue_t RCTGetUIManagerQueue(void);
124 129
 	[CATransaction commit];
125 130
 }
126 131
 
127
-- (void)assertNavigationControllerExist:(UIViewController *)viewController reject:(RCTPromiseRejectBlock)reject {
128
-	if (!viewController.navigationController) {
132
+- (void)assertNavigationControllerExist:(UINavigationController *)viewController reject:(RCTPromiseRejectBlock)reject {
133
+	if (![viewController isKindOfClass:[UINavigationController class]]) {
129 134
 		_completionBlock = nil;
130 135
 		[RNNErrorHandler reject:reject withErrorCode:RNNCommandErrorCodeNoStack errorDescription:[NSString stringWithFormat:@"%@ should be called from a stack child component", [RNNErrorHandler getCallerFunctionName]]];
131 136
 	}
132 137
 }
133 138
 
139
+- (RNNNavigationController*)getComponentStack:(NSString *)componentId {
140
+	UIViewController* component = [_store findComponentForId:componentId];
141
+	if ([component isKindOfClass:[UINavigationController class]]) {
142
+		return (RNNNavigationController*)component;
143
+	} else {
144
+		return (RNNNavigationController*)component.navigationController;
145
+	}
146
+}
147
+
134 148
 -(void)removePopedViewControllers:(NSArray*)viewControllers {
135 149
 	for (UIViewController *popedVC in viewControllers) {
136 150
 		[_store removeComponentByViewControllerInstance:popedVC];