美文网首页
关于iOS App中自定义警告Alert类的弹窗的使用

关于iOS App中自定义警告Alert类的弹窗的使用

作者: dragonYao | 来源:发表于2016-12-21 11:31 被阅读1807次
最近项目不是很紧,把以前遇到的弹窗类的问题总结一下,以避免以后复习查看。(前面文字说明很长,看文章的可以跳过)

一般项目中使用的警告类弹窗是系统自带的UIAlertView 或者UIAlertController就能满足需求,但是其样式是固定的,修改起来比较的有局限性,但是设计师又不想使用这种系统的样式,那我们就只能按照设计师的要求去自定义Alert,那么问题就来了。o(╯□╰)o

问题
  • 如果涉及到网络,我们自定义的弹窗能满足项目的需要,往往也会伴随着Crash(具体情况下面说),安全这一块没有系统的Alert处理的好(大牛写的除外)
  • 我们自定义的Alert没有很大的可扩展性,仅仅能满足自己的项目需要
  • 打个广告我使用的可扩展比较强,非常好用Alert的应该属 CustomIOSAlertView ,可以根据项目的需要进行自定义View,但是这依旧不能满足我们的设计师的眼光。😔
还是乖乖的自定义Alert吧

上面说到了涉及到网络Crash的情况是这样的,我们自定义的Alert需要在一个页面的网络请求返回后弹出,这个时候我们Push或者Pressent到了另一个页面,刚好上个页面的请求返回了,就会出现在我们当前的页面,点击上面的按钮,Crash!!!

如何改进?
  • 使用单利,就算在其他的页面弹出,起码不会造成崩溃
  • block回调(这种方法不适合我目前的项目)
  • 让自定义的Alert只在显示的页面出现,(需要传进去当前Controller)
这里我就用单利写一个简单的Alert(Frame和按钮的个数 我就写死了)O(∩_∩)O哈哈~ 尴尬😁
  • .h中方法声明
@interface CTTAlertView : UIView
+(id)shareInstance;
-(void)showViewAtViewController:(UIViewController *)controller
                     withMessage:(NSString *)message
                      withCancel:(NSString *)cancel
                     withConfirm:(NSString *)confirm;
@end
  • .m中实现
#import "CTTAlertView.h"
#define kAlertViewH 148.0
#define kAlertViewW 300.0
#define kMargin 10.0
#define kBtnW 100.0
#define kBtnH 22.0
#define kLeftMargin 16.0
#define kBottomMargin 13.0
@interface CTTAlertView ()
@property (nonatomic, strong) UIImageView *imgView;
@property (nonatomic, strong) UIView *separatorView;
@property (nonatomic, strong) UIView *alertView;
@property (nonatomic, strong) UILabel *msgLabel;
@property (nonatomic, strong) UIButton *cancelBtn;
@property (nonatomic, strong) UIButton *confirmBtn;
@end
@implementation CTTAlertView
+(id)shareInstance {
    static dispatch_once_t onceToken;
    static CTTAlertView *instance = nil;
    dispatch_once(&onceToken, ^{
        instance = [[CTTAlertView alloc] init];
    });
    return instance;
}
-(instancetype)init {
    self = [super init];
    if (self) {
        [self setupViews];
    }
    return self;
}
-(instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupViews];
    }
    return self;
}
-(void)setupViews {
    self.frame = CGRectMake(0, 0, KWIDTH, KHEIGHT);
    self.backgroundColor = RGBACOLOR(0, 0, 0, .5);
    //background image view
    self.imgView = [[UIImageView alloc] initWithFrame:CGRectMake((KWIDTH - kAlertViewW) / 2.0, (KHEIGHT - kAlertViewH - 64.0) / 2.0, kAlertViewW, kAlertViewH)];
    self.imgView.userInteractionEnabled = YES;
    self.imgView.contentMode = UIViewContentModeScaleAspectFill;
    self.imgView.image = [UIImage imageNamed:@"pop_alert_icon"];
    [self addSubview:self.imgView];
    //view
    self.alertView = [[UIView alloc] initWithFrame:CGRectMake(self.imgView.frame.origin.x + kMargin, self.imgView.frame.origin.y + kMargin, (kAlertViewW - kMargin * 2), (kAlertViewH - kMargin * 2))];
    self.alertView.backgroundColor = [UIColor whiteColor];
    self.alertView.layer.cornerRadius = 2.0;
    self.alertView.layer.masksToBounds = YES;
    [self addSubview:self.alertView];
    //cancel  button
    CGFloat yOffset = self.alertView.frame.size.height - kBottomMargin - kBtnH;
    UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    cancelBtn.frame = CGRectMake(kLeftMargin, yOffset, kBtnW, kBtnH);
    [cancelBtn setTitleColor:kColor(153, 153, 153, 1)
                    forState:UIControlStateNormal];
    cancelBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
    [cancelBtn addTarget:self
                  action:@selector(cancelBtnAction:)
        forControlEvents:UIControlEventTouchUpInside];
    [self.alertView addSubview:cancelBtn];
    self.cancelBtn = cancelBtn;
    //confirm button
    CGFloat xOffset = self.alertView.frame.size.width - kLeftMargin - kBtnW;
    UIButton *confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    confirmBtn.frame = CGRectMake(xOffset, yOffset, kBtnW, kBtnH);
    [confirmBtn setTitleColor:KKhaki
                     forState:UIControlStateNormal];
    confirmBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
    [confirmBtn addTarget:self
                   action:@selector(confirmBtnAction:)
         forControlEvents:UIControlEventTouchUpInside];
    [self.alertView addSubview:confirmBtn];
    self.confirmBtn = confirmBtn;
    //separator line
    UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake((self.alertView.frame.size.width - 1.0) / 2.0, self.alertView.frame.size.height - 17.0 - 15.0, 1.0, 17.0)];
    separatorView.backgroundColor = kColor(0, 0, 0, 0.1);
    [self.alertView addSubview:separatorView];
    //message label
    CGFloat labelW = self.alertView.frame.size.width - 8 * 2;
    self.msgLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, labelW, 74.0)];
    self.msgLabel.font = [UIFont systemFontOfSize:14];
    self.msgLabel.textAlignment = NSTextAlignmentCenter;
    self.msgLabel.textColor = [UIColor blackColor];
    self.msgLabel.numberOfLines = 0;
    self.msgLabel.lineBreakMode = NSLineBreakByWordWrapping;
    self.msgLabel.preferredMaxLayoutWidth = labelW;
    [self.alertView addSubview:self.msgLabel];
}
-(void)showViewAtViewController:(UIViewController *)controller
                     withMessage:(NSString *)message
                      withCancel:(NSString *)cancel
                     withConfirm:(NSString *)confirm
{
    UIView *bgView = (UIView *)controller.view;
    [bgView addSubview:self];

    [self.cancelBtn setTitle:cancel
                    forState:UIControlStateNormal];
    [self.confirmBtn setTitle:confirm
                     forState:UIControlStateNormal];
    self.msgLabel.text = (message == nil) ? @" " : message;
}
-(void)removeAlertViewFromSupview {
    [self removeFromSuperview];
}
#pragma mark - ButtonAction
-(void)cancelBtnAction:(UIButton *)sender {
    [self removeFromSuperview];
}
-(void)confirmBtnAction:(UIButton *)sender {
    [self removeFromSuperview];
}
@end
记录一下这个点,方便以后查看,如有代码有什么不妥,请留言多多指教。😀🙏

相关文章

网友评论

      本文标题:关于iOS App中自定义警告Alert类的弹窗的使用

      本文链接:https://www.haomeiwen.com/subject/cwqqvttx.html