最近在項目中偶爾會碰到無法顯示 SVProgressHUD挥转,也無法切換 window.rootViewController 的情況
。
經(jīng)過調試后發(fā)現(xiàn)钥组,原來是使用第三方 SDK 的時候又創(chuàng)建了一個 UIWindow输硝,導致我的 UIWindow 處于非活躍狀態(tài),因此無法顯示 keyWindow 和切換 window.rootViewController
程梦。
我的 UIWindow tag 為 4399点把,第三方 SDK 的 UIWindow tag 為 0。
打開第三方 SDK 之后的 UIWindow 狀態(tài)如圖:
第三方 SDK 關閉之后屿附,其 UIWindow 的 windowLevel 為 -1郎逃,如下圖:
解決思路:
- 調用第三方 SDK 之后,添加一個定時器
- 每隔一秒判斷一下第三方 SDK 的 UIWindow windowLevel挺份,如果小于 0褒翰,則使用我的 UIWindow 調用 makeKeyAndVisible
- 注銷定時器
代碼:
//添加定時器,監(jiān)聽第三方 SDK 的 UIWindow windowLevel
- (void)addTimer{
self.fmTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(monitorStatus) userInfo:nil repeats:YES];
}
- (void)monitorStatus{
//當前活躍的 UIWindow 為我的 UIWindow
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if (window.tag == kAxWindowTag) {//我的 UIWindow 處于活躍狀態(tài)匀泊,無需處理
//注銷定時器
[self.fmTimer invalidate];
return;
}
//第三方 SDK 的 UIWindow 為 活躍狀態(tài)
BOOL isActivity = YES;
// 已使用過第三方 SDK
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIWindow *window2 in windows) {
NSString *classStr = [NSString stringWithFormat:@"%@", [window2 class]];
if ([classStr isEqualToString:@"UIWindow"]) {
if (window2.tag == 0 && window2.windowLevel < 0) {//第三方 SDK 的 UIWindow 為 非活躍狀態(tài)
isActivity = NO;
}
//當前遍歷到 MY UIWindow优训, 并且第三方 SDK 的 UIWindow 為 非活躍狀態(tài)
if (window2.tag == kAxWindowTag && !isActivity) {
[self.fTimer invalidate];
[window2 makeKeyAndVisible];
}
} else {// UIWindow class 為 UITextEffectsWindow
//NSLog(@"-->> 3 UITextEffectsWindow :%@", [window2 class]);
}
}
}