iOS多个弹框显示,冲突的问题(keyWindow、delegate window、windows lastObject)

判空弹框

 AS_ZBPublishRemindView *remindV = [[AS_ZBPublishRemindView alloc]initWithFrame:CGRectMake(autoScaleW(40), autoScaleH(100), APP_SCREEN_WIDTH - 2 * autoScaleW(40), autoScaleH(100))];
        [remindV setPersonData:@"支付总额不得低于10元" type:0];
        self.alert.contentView = remindV;
//        [self.alert show];
         [self.alert show:self];// 一定要采取这种方式,采用上面的直接的show方式的话,只要时间选择器弹出过,那么判空的逻辑,将不会弹框
        self.publishBtn.userInteractionEnabled = YES;

时间选择器弹框


             [self.datePicker show:self];// 将当前类的对象作为参数传递给基类,传参的目的是:基类会添加到当前类的对象。
            @weakify(self);
            self.datePicker.onSubmitClickBlock = ^(NSString *timeStr, NSString *convertTime) {
                @strongify(self);
                [self sureTime:timeStr convertTime:convertTime];
            };

[self.datePicker show:self];这行代码的基类(ZBPickerView)是这么实现的

-(void)show:(UIViewController *)vc{
    [vc.view addSubview:self];//将基类(ZBPickerView)添加到控制器的view中,也就是添加到AS_ZBPublishVC的view中
    self.bG_BlackView.hidden = NO;
    self.coverWhiteView.hidden = NO;
}

AS_ZBPublishRemindView对应的[self.alert show]; 和ZBPickerView的 对应的[self.datePicker show];方式,他们的基类实现方式分别如下

AS_ZBPublishRemindView对应的[self.alert show];的实现方式
- (void)show{
    self.bG_BlackView.hidden = NO;
    self.coverWhiteView.hidden = NO;
      UIWindow *topWindow = [[[UIApplication sharedApplication] delegate] window];
    [topWindow addSubview:self.bG_BlackView];
    [topWindow addSubview:self.coverWhiteView];
}

ZBPickerView对应的[self.datePicker show];的实现方式
- (void)show {
    
 //   UIWindow *window = [[UIApplication sharedApplication] keyWindow];
//    UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
    UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
    NSArray *windowViews = [window subviews];
    if(windowViews && [windowViews count] > 0){
        UIView *subView = [windowViews objectAtIndex:[windowViews count]-1];
        for(UIView *aSubView in subView.subviews)
        {
            [aSubView.layer removeAllAnimations];// 遍历移除窗口上的所有图层
        }
        [subView addSubview:self];
        [self showBackground];
        [self showAlertAnimation];
    }

}

可以看出,这两种实现方式是一样的,所以一个弹框弹出来,另一个就会没法弹出,因为第一个弹出来,然后隐藏之后。执行第二个弹框的代码时,取的是[[[UIApplication sharedApplication] delegate] window],仍是第一个弹出来界面,但是代码控制显示的是第二个弹框,所以弹框显示不出来。总结:取的页面和显示的页面不是一个界面,所以显示不出来


开发中弹框要采用[self.alert show:self];[self.datePicker show:self];的方式,不要采用[self.alert show];[self.datePicker show];的方式

你可能感兴趣的:(iOS多个弹框显示,冲突的问题(keyWindow、delegate window、windows lastObject))