問題
某些時候,需要隨時彈出的界面在最頂層不恭。例如:每個接口都可能返回鑒權失敗凤瘦,需要重新登錄的登錄界面或者手勢解鎖界面。
解決方案
獲取到當前最頂層Controller
#import <UIKit/UIKit.h>
@(原創(chuàng)整理)interface UIViewController (Utils)
+(UIViewController*) currentViewController;
@end
.m
#import "UIViewController+Utils.h"
@implementation UIViewController (Utils)
+(UIViewController*) findBestViewController:(UIViewController*)vc {
if (vc.presentedViewController) {
// Return presented view controller
return [UIViewController findBestViewController:vc.presentedViewController];
} else if ([vc isKindOfClass:[UISplitViewController class]]) {
// Return right hand side
UISplitViewController* svc = (UISplitViewController*) vc;
if (svc.viewControllers.count > 0)
return [UIViewController findBestViewController:svc.viewControllers.lastObject];
else
return vc;
} else if ([vc isKindOfClass:[UINavigationController class]]) {
// Return top view
UINavigationController* svc = (UINavigationController*) vc;
if (svc.viewControllers.count > 0)
return [UIViewController findBestViewController:svc.topViewController];
else
return vc;
} else if ([vc isKindOfClass:[UITabBarController class]]) {
// Return visible view
UITabBarController* svc = (UITabBarController*) vc;
if (svc.viewControllers.count > 0)
return [UIViewController findBestViewController:svc.selectedViewController];
else
return vc;
} else {
// Unknown view controller type, return last child view controller
return vc;
}
}
+(UIViewController*) currentViewController {
// Find best view controller
UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
return [UIViewController findBestViewController:viewController];
}
@end
實現(xiàn)細節(jié)總有遺漏钉寝,有時取不對,一般我采用下一種辦法
重起一個windows
原理就是多windows
機制闸迷,在當前window之上新建一個windows
嵌纲,可以保證Controller
在最上層。跟UIAlertView
顯示機制一致腥沽。當然沒UIAlertView
級別高逮走,當有UIAlertView
彈出時候,再彈出新起的Windows
時今阳,UIAlertView
還在最上师溅。
具體使用開源庫LNWindowManager即可。
創(chuàng)建并顯示一個Windows
UIWindow* window = [LNWindowManager templateWindowForName:@"demo"];
window.rootViewController = nvc;
[[LNWindowManager sharedWindowManager].topWindow presentWindow:window animated:YES completion:nil];
移除windows
[[LNWindowManager sharedWindowManager].topWindow.presentingWindow dismissWindow:[LNWindowManager sharedWindowManager].topWindow animated:YES completion:nil];
Demo
別人git
上的Demo