在写一些基础库代码时候,需要找到当前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
网友评论