当前位置: 首页 > 工具软件 > LGAlertView > 使用案例 >

LGAlertView在iOS9系统中多个弹框只展示最后一个的问题解决办法

陆野
2023-12-01

在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;
    }

 

 类似资料: