在我們做項(xiàng)目開(kāi)發(fā)中,經(jīng)常都是需要將一個(gè)view新增(addSubView)到一個(gè)superView遍膜。但是經(jīng)過(guò)多次之后席纽,此時(shí)需要在當(dāng)前的這個(gè)view去persentViewController時(shí)候。發(fā)現(xiàn)此時(shí)沒(méi)有合適的ViewController的對(duì)象徊哑。所以此時(shí)的思路一般有兩種:
1.直接獲取window的rootViewController
2.不斷遍歷view的superView直到獲取到第一個(gè)viewController
第一種的解決方法:
UIViewController *VC = [[[UIApplication sharedApplication] keyWindow] rootViewController];
第二種解決方法
在UIViewController的類(lèi)別中創(chuàng)建如下方法
+ (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;
}
如上兩種解決方案笛钝,按照業(yè)務(wù)需求進(jìn)行選擇质况,此時(shí)就能在view進(jìn)行view controller才能做的一些跳轉(zhuǎn)操作愕宋。
獲取當(dāng)前項(xiàng)目的頂層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;
}