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

最近项目不是很紧,把以前遇到的弹窗类的问题总结一下,以避免以后复习查看。(前面文字说明很长,看文章的可以跳过)

一般项目中使用的警告类弹窗是系统自带的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
记录一下这个点,方便以后查看,如有代码有什么不妥,请留言多多指教。😀🙏
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容