美文网首页iOS常用
iOS 移除当前导航控制器栈中的控制器

iOS 移除当前导航控制器栈中的控制器

作者: KingWorld | 来源:发表于2021-07-30 16:21 被阅读0次

.h文件

/**
 移除当前导航控制器栈中的控制器
 
 @param coordinateVC    坐标控制器,表示是从哪个控制器开始移除
 
 【案例用法】比如从A push B, B push C, C push D, 现在需要你从D pop 到 A, 要达到这样的效果, 则在D调pop方法之前, 在 D控制器下调下面的方法先移除BC两个控制器,此时(coordinateVC传self,removeIndex传1,表示从D上removeIndex个控制器移除,removeLength )
 */
+ (void)kl_removeCurrenStackVCWithCoordinateVC:(UIViewController *)coordinateVC
                                   removeIndex:(NSUInteger)removeIndex
                                  removeLength:(NSUInteger)removeLength;

/**
 *  获取当前视图的控制器
 */
+ (UIViewController *)kl_getCurrentVC;

.m文件

#import "UIViewController+Extension.h"

@implementation UIViewController (Extension)



+ (void)kl_removeCurrenStackVCWithCoordinateVC:(UIViewController *)coordinateVC
                                   removeIndex:(NSUInteger)removeIndex
                                  removeLength:(NSUInteger)removeLength
{
    if (!coordinateVC.navigationController) {
        return;
    }
    
    NSMutableArray *vcArray = coordinateVC.navigationController.childViewControllers.mutableCopy;
    
    NSInteger coordinateVCIndex = [vcArray indexOfObject:coordinateVC];
    if (coordinateVCIndex == NSNotFound) {
        return;
    }
    
    if (coordinateVCIndex < removeIndex + removeLength) { // 导航控制器栈里面至少留一个控制器
        return;
    }
    
    NSRange range = NSMakeRange(coordinateVCIndex - removeIndex - removeLength + 1, removeLength);
    NSLog(@"哈哈哈哈: %ld-%ld", range.location, range.length);
    
    [vcArray removeObjectsInRange:range];
    
    [coordinateVC.navigationController setViewControllers:vcArray];
}

+ (UIViewController *)kl_getCurrentVC {
    UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
    
    return currentVC;
}

+ (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC {
    UIViewController *currentVC;
    
    if ([rootVC presentedViewController]) { // 视图是被presented出来的
        rootVC = [rootVC presentedViewController];
    }
    
    if ([rootVC isKindOfClass:[UITabBarController class]]) { // 根视图为UITabBarController
        currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
        
    }else if ([rootVC isKindOfClass:[UINavigationController class]]) { // 根视图为UINavigationController
        currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];
        
    }else {  // 根视图为非导航类
        currentVC = rootVC;
    }
    
    return currentVC;
}

@end

相关文章

网友评论

    本文标题:iOS 移除当前导航控制器栈中的控制器

    本文链接:https://www.haomeiwen.com/subject/sxkcvltx.html