@@ -69,7 +69,7 @@ @implementation GDDViewControllerTransition {
6969- (void (^)())toUp {
7070 return ^{
7171 _alreadyInStack = YES ;
72- _viewController = GDDViewControllerTransition.backViewController ?: GDDViewControllerTransition. topViewController ;
72+ _viewController = GDDViewControllerTransition.upViewController ;
7373 [self mergeViewOption ];
7474 [self displayAndRefresh ];
7575 };
@@ -253,20 +253,29 @@ + (UIViewController *)findTopViewController:(UIViewController *)parent {
253253 if (parent.presentedViewController && !parent.presentedViewController .isBeingDismissed ) {
254254 return [self findTopViewController: parent.presentedViewController];
255255 }
256- UIViewController *child = [self getVisibleChildViewController: parent];
257- return child ? [self findTopViewController: child] : parent;
256+ return [self findVisibleChildViewController: parent];
258257}
259258
260- + (UIViewController *)backViewController {
261- UIViewController *top = GDDViewControllerTransition .topViewController ;
262- NSArray *navViewControllers = top .navigationController .viewControllers ;
259+ + (UIViewController *)upViewController {
260+ UIViewController *current = self .topViewController ;
261+ NSArray *navViewControllers = current .navigationController .viewControllers ;
263262 if (navViewControllers.count > 1 ) {
264263 return navViewControllers[navViewControllers.count - 2 ];
265- } else if (top.presentingViewController ) {
266- UIViewController *child = [self getVisibleChildViewController: top.presentingViewController];
267- return child ?: top.presentingViewController ;
268264 }
269- return nil ;
265+ if (current.presentingViewController ) {
266+ return [self findVisibleChildViewController: current.presentingViewController];
267+ }
268+
269+ while (current.parentViewController ) {
270+ UIViewController *parent = current.parentViewController ;
271+ if ([parent isMemberOfClass: UIPageViewController.class] || [parent isMemberOfClass: UINavigationController.class] ||
272+ [parent isMemberOfClass: UITabBarController.class]) { // skip system's view controllers
273+ current = parent;
274+ continue ;
275+ }
276+ return parent;
277+ }
278+ return current;
270279}
271280
272281+ (UIViewController *)findViewController : (Class )viewControllerClass {
@@ -327,6 +336,11 @@ + (BOOL)isSame:(id)controllerOrClass with:(UIViewController *)otherController in
327336 return isInstance ? controllerOrClass == otherController : [otherController isKindOfClass: controllerOrClass];
328337}
329338
339+ + (UIViewController *)findVisibleChildViewController : (UIViewController *)parent {
340+ UIViewController *child = [self getVisibleChildViewController: parent];
341+ return child ? [self findVisibleChildViewController: child] : parent;
342+ }
343+
330344+ (UIViewController *)getVisibleChildViewController : (UIViewController *)parent {
331345 if ([parent isKindOfClass: UINavigationController.class]) {
332346 return ((UINavigationController *) parent).topViewController ;
0 commit comments