在iOS9系统中只展示了最后一个,将最后一个关闭没有展示前面的弹框原因是
LGAlertViewWindowsObserver.m中的- (void)windowVisibleChanged:(NSNotification *)notification 方法
dispatch_after这个代码有问题(为什么使用dispatch_after0秒?)
导致下面代码中iOS9系统weakWindow有值,不会展示之前的alertWindow,在iOS12系统中weakWindow值为nil,可以展示
else if (notification.name == UIWindowDidBecomeHiddenNotification) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (!weakWindow) {
UIWindow *lastWindow = [self lastWindow];
if (lastWindow) {
[lastWindow makeKeyAndVisible];
}
}
});
}
解决办法:自己写显示与隐藏即keyWinow自己控制谁该显示谁该删除
声名全局数组
@property (nonatomic, retain) NSMutableArray *alertViewYYYFix;
_alertViewYYYFix = [[NSMutableArray alloc]initWithCapacity:20];
在LGAlertView.m的- (void)showAnimated:(BOOL)animated hidden:(BOOL)hidden completionHandler:(LGAlertViewCompletionHandler)completionHandler方法中在最前面加上一句
[Single.alertViewYYYFix addObject:self.window]; //所有的show最终都到这里
在- (void)dismissComplete 方法中在最前面加上一句
[Single.alertViewYYYFix removeObject:self.window];
在LGAlertViewWindowsObserver.m中的- (void)windowVisibleChanged:(NSNotification *)notification最前面加上
if (!IOS10_OR_LATER) {
UIWindow *window = notification.object;
NSString *windowClassName = NSStringFromClass([window class]);
if (![windowClassName containsString:@"Alert"]) {
return;
}
//
//自己记录的window数组
//
NSMutableArray *mu = Single.alertViewYYYFix;
if (notification.name == UIWindowDidBecomeVisibleNotification) {
//
//最后一个应该展示
//
if (window == mu.lastObject) {
NSLog(@"");
}
}else if (notification.name == UIWindowDidBecomeHiddenNotification) {
//
//由于是先删除再走这个方法 所以包含的话按原有逻辑隐藏
//
if([mu containsObject:window]){
NSLog(@"");
}else{
//
//已经删除了最后一个弹框则需要展示倒数第二个弹框
//
UIWindow *lastSecond = mu.lastObject;
[lastSecond makeKeyAndVisible];
}
}
return;
}