-
Notifications
You must be signed in to change notification settings - Fork 194
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added shouldDismissPresentedViewController property to options #33
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -78,18 +78,35 @@ @interface UPRouterOptions () | |
|
||
@implementation UPRouterOptions | ||
|
||
//Backwards compatibility | ||
+ (instancetype)routerOptionsWithPresentationStyle: (UIModalPresentationStyle)presentationStyle | ||
transitionStyle: (UIModalTransitionStyle)transitionStyle | ||
defaultParams: (NSDictionary *)defaultParams | ||
isRoot: (BOOL)isRoot | ||
isModal: (BOOL)isModal | ||
{ | ||
return [self routerOptionsWithPresentationStyle:presentationStyle | ||
transitionStyle:transitionStyle | ||
defaultParams:defaultParams | ||
isRoot:isRoot | ||
isModal:isModal | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
//Explicit construction | ||
+ (instancetype)routerOptionsWithPresentationStyle: (UIModalPresentationStyle)presentationStyle | ||
transitionStyle: (UIModalTransitionStyle)transitionStyle | ||
defaultParams: (NSDictionary *)defaultParams | ||
isRoot: (BOOL)isRoot | ||
isModal: (BOOL)isModal { | ||
isModal: (BOOL)isModal | ||
shouldDismissPresentedViewController: (BOOL)shouldDismissPresentedViewController | ||
{ | ||
UPRouterOptions *options = [[UPRouterOptions alloc] init]; | ||
options.presentationStyle = presentationStyle; | ||
options.transitionStyle = transitionStyle; | ||
options.defaultParams = defaultParams; | ||
options.shouldOpenAsRootViewController = isRoot; | ||
options.modal = isModal; | ||
options.shouldDismissPresentedViewController = shouldDismissPresentedViewController; | ||
return options; | ||
} | ||
//Default construction; like [NSArray array] | ||
|
@@ -98,7 +115,8 @@ + (instancetype)routerOptions { | |
transitionStyle:UIModalTransitionStyleCoverVertical | ||
defaultParams:nil | ||
isRoot:NO | ||
isModal:NO]; | ||
isModal:NO | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
|
||
//Custom class constructors, with heavier Objective-C accent | ||
|
@@ -107,35 +125,48 @@ + (instancetype)routerOptionsAsModal { | |
transitionStyle:UIModalTransitionStyleCoverVertical | ||
defaultParams:nil | ||
isRoot:NO | ||
isModal:YES]; | ||
isModal:YES | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
+ (instancetype)routerOptionsWithPresentationStyle:(UIModalPresentationStyle)style { | ||
return [self routerOptionsWithPresentationStyle:style | ||
transitionStyle:UIModalTransitionStyleCoverVertical | ||
defaultParams:nil | ||
isRoot:NO | ||
isModal:NO]; | ||
isModal:NO | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
+ (instancetype)routerOptionsWithTransitionStyle:(UIModalTransitionStyle)style { | ||
return [self routerOptionsWithPresentationStyle:UIModalPresentationNone | ||
transitionStyle:style | ||
defaultParams:nil | ||
isRoot:NO | ||
isModal:NO]; | ||
isModal:NO | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
+ (instancetype)routerOptionsForDefaultParams:(NSDictionary *)defaultParams { | ||
return [self routerOptionsWithPresentationStyle:UIModalPresentationNone | ||
transitionStyle:UIModalTransitionStyleCoverVertical | ||
defaultParams:defaultParams | ||
isRoot:NO | ||
isModal:NO]; | ||
isModal:NO | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
+ (instancetype)routerOptionsAsRoot { | ||
return [self routerOptionsWithPresentationStyle:UIModalPresentationNone | ||
transitionStyle:UIModalTransitionStyleCoverVertical | ||
defaultParams:nil | ||
isRoot:YES | ||
isModal:NO]; | ||
isModal:NO | ||
shouldDismissPresentedViewController:YES]; | ||
} | ||
+ (instancetype)routerOptionsAsKeepPresentedViewController { | ||
return [self routerOptionsWithPresentationStyle:UIModalPresentationNone | ||
transitionStyle:UIModalTransitionStyleCoverVertical | ||
defaultParams:nil | ||
isRoot:NO | ||
isModal:NO | ||
shouldDismissPresentedViewController:NO]; | ||
} | ||
|
||
//Exposed methods previously supported | ||
|
@@ -154,6 +185,9 @@ + (instancetype)forDefaultParams:(NSDictionary *)defaultParams { | |
+ (instancetype)root { | ||
return [self routerOptionsAsRoot]; | ||
} | ||
+ (instancetype)keepPresentedViewController { | ||
return [self routerOptionsAsKeepPresentedViewController]; | ||
} | ||
|
||
//Wrappers around setters (to continue DSL-like syntax) | ||
- (UPRouterOptions *)modal { | ||
|
@@ -176,6 +210,10 @@ - (UPRouterOptions *)root { | |
[self setShouldOpenAsRootViewController:YES]; | ||
return self; | ||
} | ||
- (UPRouterOptions *)keepPresentedViewController { | ||
[self setShouldDismissPresentedViewController:NO]; | ||
return self; | ||
} | ||
@end | ||
|
||
@interface UPRouter () | ||
|
@@ -268,15 +306,21 @@ - (void)open:(NSString *)url animated:(BOOL)animated { | |
|
||
UIViewController *controller = [self controllerForRouterParams:params]; | ||
|
||
if (self.navigationController.presentedViewController) { | ||
if (self.navigationController.presentedViewController && [options shouldDismissPresentedViewController]) { | ||
[self.navigationController dismissViewControllerAnimated:animated completion:nil]; | ||
} | ||
|
||
if ([options isModal]) { | ||
if ([controller.class isSubclassOfClass:UINavigationController.class]) { | ||
[self.navigationController presentViewController:controller | ||
animated:animated | ||
completion:nil]; | ||
UIViewController* controllerToPresentOn = self.navigationController; | ||
|
||
if (self.navigationController.presentedViewController) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should we use an additional option for this new behavior? like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this check is actually just present to avoid not showing the new controller at all. The problem is that iOS doesn't allow to push an a controller which is already presenting a controller. So if at this point the navigationController still has a presentedViewController, shouldDismissPresentedViewController must have been false so we really want to push the new controller on top of the presentedViewController There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yup that can happen, but "shouldDismissPresentedViewController must have been false..." makes an assumption that everyone is using Routable for all their modal controllers which may not be true I'd rather opt-in to this behavior, and if the user hasn't opt'd in and encounters this case ( |
||
controllerToPresentOn = self.navigationController.presentedViewController; | ||
} | ||
|
||
[controllerToPresentOn presentViewController:controller | ||
animated:animated | ||
completion:nil]; | ||
} | ||
else { | ||
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we make another method, keeping the original signature (without the
shouldDismissPresentedViewController
arg), and have it propagate the defaultYES
value to this new constructor?just for backwards-compat