最近在项目中偶尔会碰到无法显示 SVProgressHUD,也无法切换 window.rootViewController 的情况
。
经过调试后发现,原来是使用第三方 SDK 的时候又创建了一个 UIWindow,导致我的 UIWindow 处于非活跃状态,因此无法显示 keyWindow 和切换 window.rootViewController
。
我的 UIWindow tag 为 4399,第三方 SDK 的 UIWindow tag 为 0。
打开第三方 SDK 之后的 UIWindow 状态如图:
第三方 SDK 关闭之后,其 UIWindow 的 windowLevel 为 -1,如下图:
解决思路:
- 调用第三方 SDK 之后,添加一个定时器
- 每隔一秒判断一下第三方 SDK 的 UIWindow windowLevel,如果小于 0,则使用我的 UIWindow 调用 makeKeyAndVisible
- 注销定时器
代码:
//添加定时器,监听第三方 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 处于活跃状态,无需处理
//注销定时器
[self.fmTimer invalidate];
return;
}
//第三方 SDK 的 UIWindow 为 活跃状态
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 为 非活跃状态
isActivity = NO;
}
//当前遍历到 MY UIWindow, 并且第三方 SDK 的 UIWindow 为 非活跃状态
if (window2.tag == kAxWindowTag && !isActivity) {
[self.fTimer invalidate];
[window2 makeKeyAndVisible];
}
} else {// UIWindow class 为 UITextEffectsWindow
//NSLog(@"-->> 3 UITextEffectsWindow :%@", [window2 class]);
}
}
}