美文网首页
iOS 递归找寻最上方的控制器topmostViewContro

iOS 递归找寻最上方的控制器topmostViewContro

作者: moxacist | 来源:发表于2018-08-06 18:56 被阅读47次

在写一些基础库代码时候,需要找到当前window最上层控制器做一些操作

具体方法如下

- (UIViewController *)getTopmostViewController{
    UIViewController *rootViewContoller = [UIApplication sharedApplication].delegate.window.rootViewController;
    return [rootViewContoller test_getTopmostViewController];
}

- (UIViewController *)test_getTopmostViewController{
    if (self.presentedViewController && [self.presentedViewController isComplianceTopmostViewController]) {
        return [self.presentedViewController test_getTopmostViewController];
    } else if ([self isKindOfClass:[UITabBarController class]]) {
        return [[(UITabBarController *)self selectedViewController] test_getTopmostViewController];
    }else if ([self isKindOfClass:[UINavigationController class]]) {
        return [[((UINavigationController*)self) topViewController] test_getTopmostViewController];
    }
    return self;
}

/** 判断是不是合规的顶层controller*/
- (BOOL)isComplianceTopmostViewController{
    NSArray *clsNames = @[@"UIAlertController"];
    BOOL isCompliance = YES;
    for (NSString *clsName in clsNames) {
        Class cls = NSClassFromString(clsName);
        if (cls && [self isKindOfClass:cls]) {
            isCompliance = NO;
            break;
        }
    }
    return isCompliance;
}

如果没接触过presentedViewController 和 presentingViewController的话可能会有点懵逼

API文档上:
presentedViewController: The view controller that was presented by this view controller or its nearest ancestor.
presentingViewController: The view controller that presented this view controller (or its farthest ancestor.)
简单来说 presentingViewController是上级页面, presentedViewController是下级页面
a 跳转到 b ,a的presentedViewController就是b
b的presentingViewController就是a

相关文章

网友评论

      本文标题:iOS 递归找寻最上方的控制器topmostViewContro

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