判空弹框
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]
,仍是第一个弹出来界面,但是代码控制显示的是第二个弹框,所以弹框显示不出来。总结:取的页面和显示的页面不是一个界面,所以显示不出来