一些場景需要把一切跳轉干掉代兵,回到根視圖!(一位大佬寫的爷狈,俺只是搬運工??)
思路1:root有3種可能 1.控制器 2擁有導航欄的控制器 3是tabBar控制器
思路2:首先理解presentedViewController presentingViewController visibleViewController這3個屬性
思路3:我們可以拿到root所對應的控制器跟當前的最上層進行比較,如果不一樣裳擎,說明顯示層不是root涎永,不是root那我們則需要把前面一長串跳轉干掉,如何完美的干掉這一長串呢鹿响?我們知道dismiss這個方法有個代碼塊羡微,這就說明了該方法存在延遲性,如果一層一層的dismiss那么是有可能出問題的惶我。
-
思路3:既然不能一層一層的進行dismiss那么我們可以換一種思路妈倔,拿到當前顯示層后一層一層往下找,直到該控制器沒有下一層時我們直接拿該控制器進行dismiss就可以了绸贡,nav就使用popToRoot盯蝴!
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> typedef NS_ENUM(NSUInteger, AnimationType) { AnimationTypeBottom, AnimationTypeLeft, }; @interface JumpVCManager : NSObject @property (nonatomic,strong) UIViewController* rootVC; + (instancetype)shareInstance; - (void)backToRootVCAnimation:(AnimationType)type; - (void)backToRootVC; - (UIViewController *)visibleVC; @end #import "JumpVCManager.h" @interface JumpVCManager() @property (nonatomic) BOOL isJumping;// 是否正在跳轉 @end @implementation JumpVCManager + (instancetype)shareInstance{ static JumpVCManager *_shareInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _shareInstance = [[self alloc] init]; }); return _shareInstance; } - (UIViewController *)rootVC{ UIViewController *rootViewcontroller = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; UIViewController *rootVC = rootViewcontroller; if ([rootViewcontroller isKindOfClass:[UITabBarController class]]) { UITabBarController *tabVC = (UITabBarController*)rootViewcontroller; if ([tabVC.selectedViewController isKindOfClass:[UINavigationController class]]) { rootVC = [(UINavigationController*)(tabVC.selectedViewController) viewControllers][0]; } else { rootVC = tabVC.selectedViewController; } } else if ([rootViewcontroller isKindOfClass:[UINavigationController class]]) { UINavigationController *nav = (UINavigationController *)rootViewcontroller; rootVC = nav.viewControllers[0]; } return rootVC; } - (void)backToRootVCAnimation:(AnimationType)type{ [self addAnimationWithType:type]; [self backToRootVC]; } - (void)addAnimationWithType:(AnimationType)type{ CATransition *animation = [CATransition animation]; //動畫時間 animation.duration = 0.25f; //過濾效果 animation.type = kCATransitionReveal; //動畫執(zhí)行完畢時是否被移除 animation.removedOnCompletion = YES; animation.subtype = kCATransitionFromBottom; if (type == AnimationTypeLeft) { animation.subtype = kCATransitionFromLeft; } [[UIApplication sharedApplication].keyWindow.layer addAnimation:animation forKey:nil]; } - (void)backToRootVC{ if (self.isJumping == NO) { self.isJumping = YES; NSLog(@"start"); [self backToRootViewController]; } } - (void)backToRootViewController{ NSLog(@"bbbbbbbbbbbbbbb"); UIViewController* vc = [self visibleVC]; if ([vc isEqual:self.rootVC]) { NSLog(@"end"); self.isJumping = NO; return; } if (vc.presentingViewController) { while (vc.presentingViewController) { vc = vc.presentingViewController; } [vc dismissViewControllerAnimated:NO completion:^{ [self backToRootViewController]; }]; } else{ [vc.navigationController popToRootViewControllerAnimated:NO]; [self backToRootViewController]; } } - (UIViewController *)visibleVC{ UIViewController *rootViewController =[[[[UIApplication sharedApplication] delegate] window] rootViewController]; return [JumpVCManager getVisibleViewControllerFrom:rootViewController]; } + (UIViewController *) getVisibleViewControllerFrom:(UIViewController *) vc { if ([vc isKindOfClass:[UINavigationController class]]) { return [JumpVCManager getVisibleViewControllerFrom:[((UINavigationController *) vc) visibleViewController]]; } else if ([vc isKindOfClass:[UITabBarController class]]) { return [JumpVCManager getVisibleViewControllerFrom:[((UITabBarController *) vc) selectedViewController]]; } else { if (vc.presentedViewController) { return [JumpVCManager getVisibleViewControllerFrom:vc.presentedViewController]; } else { return vc; } } } @end