在我们做项目开发中,经常都是需要将一个view新增(addSubView)到一个superView。但是经过多次之后,此时需要在当前的这个view去persentViewController时候。发现此时没有合适的ViewController的对象。所以此时的思路一般有两种:
1.直接获取window的rootViewController
2.不断遍历view的superView直到获取到第一个viewController
第一种的解决方法:
UIViewController *VC = [[[UIApplication sharedApplication] keyWindow] rootViewController];
第二种解决方法
在UIViewController的类别中创建如下方法
+ (UIViewController *)getRecentlyViewControllerForView:(UIView *)currentView {
for(UIView *next = [currentView superView]; next; next = [next superView]) {
UIResponsder *nextResponsder = [next nextResponder];
if([nextResponsder isKindOfClass:[UIViewController class]]) {
return nextResponsder;
}
}
return nil;
}
如上两种解决方案,按照业务需求进行选择,此时就能在view进行view controller才能做的一些跳转操作。
获取当前项目的顶层Controller
+ (UIViewController *)getCurrentController {
UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
while (YES) {
if ([vc isKindOfClass:[UITabBarController class]]) {
vc = ((UITabBarController *)vc).selectedViewController;
} else if ([vc isKindOfClass:[UINavigationController class]]) {
vc = ((UINavigationController *)vc).visibleViewController;
}
if ([vc isKindOfClass:[UITabBarController class]] || [vc isKindOfClass:[UINavigationController class]]) {
continue;
}
if (vc.presentedViewController) {
vc = vc.presentedViewController;
} else {
break;
}
}
return vc;
}