|
@@ -8,6 +8,10 @@
|
8
|
8
|
#import "UIViewController+Rotation.h"
|
9
|
9
|
|
10
|
10
|
@implementation RCCNavigationController
|
|
11
|
+{
|
|
12
|
+ BOOL _transitioning;
|
|
13
|
+ NSMutableArray *_queuedViewControllers;
|
|
14
|
+}
|
11
|
15
|
|
12
|
16
|
NSString const *CALLBACK_ASSOCIATED_KEY = @"RCCNavigationController.CALLBACK_ASSOCIATED_KEY";
|
13
|
17
|
NSString const *CALLBACK_ASSOCIATED_ID = @"RCCNavigationController.CALLBACK_ASSOCIATED_ID";
|
|
@@ -19,6 +23,8 @@ NSString const *CALLBACK_ASSOCIATED_ID = @"RCCNavigationController.CALLBACK_ASSO
|
19
|
23
|
|
20
|
24
|
- (instancetype)initWithProps:(NSDictionary *)props children:(NSArray *)children globalProps:(NSDictionary*)globalProps bridge:(RCTBridge *)bridge
|
21
|
25
|
{
|
|
26
|
+ _queuedViewControllers = [NSMutableArray new];
|
|
27
|
+
|
22
|
28
|
NSString *component = props[@"component"];
|
23
|
29
|
if (!component) return nil;
|
24
|
30
|
|
|
@@ -218,29 +224,29 @@ NSString const *CALLBACK_ASSOCIATED_ID = @"RCCNavigationController.CALLBACK_ASSO
|
218
|
224
|
[topViewController setNavBarVisibilityChange:animatedBool];
|
219
|
225
|
|
220
|
226
|
}
|
|
227
|
+
|
|
228
|
+ // setStyle
|
|
229
|
+ if ([performAction isEqualToString:@"setStyle"])
|
|
230
|
+ {
|
|
231
|
+
|
|
232
|
+ NSDictionary *navigatorStyle = actionParams;
|
221
|
233
|
|
222
|
|
- // setStyle
|
223
|
|
- if ([performAction isEqualToString:@"setStyle"])
|
|
234
|
+ // merge the navigatorStyle of our parent
|
|
235
|
+ if ([self.topViewController isKindOfClass:[RCCViewController class]])
|
224
|
236
|
{
|
225
|
|
-
|
226
|
|
- NSDictionary *navigatorStyle = actionParams;
|
227
|
|
-
|
228
|
|
- // merge the navigatorStyle of our parent
|
229
|
|
- if ([self.topViewController isKindOfClass:[RCCViewController class]])
|
230
|
|
- {
|
231
|
|
- RCCViewController *parent = (RCCViewController*)self.topViewController;
|
232
|
|
- NSMutableDictionary *mergedStyle = [NSMutableDictionary dictionaryWithDictionary:parent.navigatorStyle];
|
233
|
|
-
|
234
|
|
- // there are a few styles that we don't want to remember from our parent (they should be local)
|
235
|
|
- [mergedStyle setValuesForKeysWithDictionary:navigatorStyle];
|
236
|
|
- navigatorStyle = mergedStyle;
|
237
|
|
-
|
238
|
|
- parent.navigatorStyle = navigatorStyle;
|
239
|
|
-
|
240
|
|
- [parent setStyleOnInit];
|
241
|
|
- [parent updateStyle];
|
242
|
|
- }
|
|
237
|
+ RCCViewController *parent = (RCCViewController*)self.topViewController;
|
|
238
|
+ NSMutableDictionary *mergedStyle = [NSMutableDictionary dictionaryWithDictionary:parent.navigatorStyle];
|
|
239
|
+
|
|
240
|
+ // there are a few styles that we don't want to remember from our parent (they should be local)
|
|
241
|
+ [mergedStyle setValuesForKeysWithDictionary:navigatorStyle];
|
|
242
|
+ navigatorStyle = mergedStyle;
|
|
243
|
+
|
|
244
|
+ parent.navigatorStyle = navigatorStyle;
|
|
245
|
+
|
|
246
|
+ [parent setStyleOnInit];
|
|
247
|
+ [parent updateStyle];
|
243
|
248
|
}
|
|
249
|
+ }
|
244
|
250
|
}
|
245
|
251
|
|
246
|
252
|
-(void)onButtonPress:(UIBarButtonItem*)barButtonItem
|
|
@@ -334,6 +340,21 @@ NSString const *CALLBACK_ASSOCIATED_ID = @"RCCNavigationController.CALLBACK_ASSO
|
334
|
340
|
return [self.topViewController preferredStatusBarStyle];
|
335
|
341
|
}
|
336
|
342
|
|
|
343
|
+- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
|
|
344
|
+{
|
|
345
|
+ if(_transitioning)
|
|
346
|
+ {
|
|
347
|
+ NSDictionary *pushDetails =@{ @"viewController": viewController, @"animated": @(animated) };
|
|
348
|
+ [_queuedViewControllers addObject:pushDetails];
|
|
349
|
+
|
|
350
|
+ return;
|
|
351
|
+ }
|
|
352
|
+
|
|
353
|
+ _transitioning = YES;
|
|
354
|
+
|
|
355
|
+ [super pushViewController:viewController animated:animated];
|
|
356
|
+}
|
|
357
|
+
|
337
|
358
|
|
338
|
359
|
#pragma mark - UINavigationControllerDelegate
|
339
|
360
|
|
|
@@ -342,5 +363,17 @@ NSString const *CALLBACK_ASSOCIATED_ID = @"RCCNavigationController.CALLBACK_ASSO
|
342
|
363
|
[viewController setNeedsStatusBarAppearanceUpdate];
|
343
|
364
|
}
|
344
|
365
|
|
|
366
|
+- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
|
|
367
|
+{
|
|
368
|
+ dispatch_async(dispatch_get_main_queue(), ^{
|
|
369
|
+ _transitioning = NO;
|
|
370
|
+ if ([_queuedViewControllers count] > 0) {
|
|
371
|
+ NSDictionary *toPushDetails = [_queuedViewControllers firstObject];
|
|
372
|
+ [_queuedViewControllers removeObjectAtIndex:0];
|
|
373
|
+ [self pushViewController:toPushDetails[@"viewController"] animated:[toPushDetails[@"animated"] boolValue]];
|
|
374
|
+ }
|
|
375
|
+ });
|
|
376
|
+}
|
|
377
|
+
|
345
|
378
|
|
346
|
379
|
@end
|