-(UIViewController *)presentingVC{
1.獲取當(dāng)前容器(window)
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal){
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows){
if (tmpWin.windowLevel == UIWindowLevelNormal){
window = tmpWin;
break;
}
}
}
2.獲取容器的根視圖
UIViewController *result = window.rootViewController;
3.遍歷根視圖最后一個(gè)視圖控制
while (result.presentedViewController) {
result = result.presentedViewController;
}
4對(duì)拿到的這個(gè)視圖控制器做一個(gè)類型判斷 OK
if ([result isKindOfClass:[UITabBarController class]]) {
result = [(UITabBarController *)result selectedViewController];
}
if ([result isKindOfClass:[UINavigationController class]]) {
result = [(UINavigationController *)result topViewController];
}
return result;
}
windowLevel系統(tǒng)定義了三個(gè)級(jí)別的Level
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar
windowLevel的定義:
typedef CGFloat UIWindowLevel NS_TYPED_EXTENSIBLE_ENUM;
其就是系統(tǒng)給CGFloat重新定義了一個(gè)名字 ->UIWindowLevel 那么UIWindowLevel肯定就是一個(gè)浮點(diǎn)數(shù)
打印測(cè)試后發(fā)現(xiàn)
UIWindowLevelNormal==0.00..
UIWindowLevelAlert==2000.00..
UIWindowLevelStatusBar==1000.00..
誰的值越大傍睹,誰就顯示在窗口的最前面,如果兩個(gè)UIWindowLevel值相等镰禾,后來者顯示在前者的上層。正常情況下如果不給UIWindowLevel一個(gè)負(fù)值,那么UIWindowLevelNormal肯定是最小值灸撰,也就是顯示在窗口的最下層槽地。
window.rootViewController
強(qiáng)調(diào)一個(gè)window.rootViewController方法 window是應(yīng)用程序的窗口斟珊,也就是一個(gè)視圖控制器的容器,它負(fù)責(zé)把相關(guān)的UIControllerView裝載其中顯示拳球。那么window就是通過rootViewController來指定一個(gè)根控制器审姓,由根控制器負(fù)責(zé)push(導(dǎo)航控制器)或者present(模態(tài))
到這里就明白怎么獲取當(dāng)前正在顯示的視圖 :1.獲取當(dāng)前容器(window)-> 2.獲取容器的根視圖 -> 3.遍歷根視圖最后一個(gè)視圖控制器 ->4對(duì)拿到的這個(gè)視圖控制器做一個(gè)類型判斷 OK
presentedViewController和presentingViewController
在模態(tài)調(diào)用中,會(huì)涉及到presented和dismiss方法 A->B (B就是A的presentedViewController祝峻,A就是B的presentingViewController) 這就是為什么我們用
while (result.presentedViewController) {
result = result.presentedViewController;
}
遍歷的原因魔吐,始終去獲取當(dāng)前視圖(剛剛開始是rootViewController)的presentedViewController也就是B視圖扎筒,直到?jīng)]有B視圖為止
https://blog.csdn.net/zrhloveswallow/article/details/25603589
https://www.cnblogs.com/wangguimin/p/4645748.html
http://www.reibang.com/p/f60471a7d935