iOS之自定义AlertView的传参问题

一,说明:






  最近在开发SDK的过程中,有一个需求是:点击按钮,弹框显示姓名和身份证号,同时在弹框中可以修改姓名和身份证号.  
 分析:需要自定义一个AlertView 和双向传值(需要用到Block).
自定义的样式为下图:



//  CommonAlertView.h
//  LCAlertView
//
//  Created by care on 16/11/8.
//  Copyright © 2016年 luochuan. All rights reserved.
//

#import <UIKit/UIKit.h>

typedef void(^cancelBlock)();
typedef void(^sureBlock)(NSString*name,NSString*idnumber);

@interface CommonAlertView : UIView

@property(nonatomic, strong)cancelBlock cancel_block;
@property(nonatomic, strong)sureBlock sure_block;
+(instancetype)alertViewWithCancelbtnClicked:(cancelBlock) cancelBlock andSureBtnClicked:(sureBlock) sureBlock withName:(NSString *)name withidcard:(NSString *)idnumber;

@end

//
//  CommonAlertView.m
//  LCAlertView
//
//  Created by care on 16/11/8.
//  Copyright © 2016年 luochuan. All rights reserved.
//

#import "CommonAlertView.h"
#define LCWINDOWS [UIScreen mainScreen].bounds.size

@interface CommonAlertView()<UITextFieldDelegate>
@property (nonatomic, strong)UIView *blackView;//背景半透明遮罩
@property (strong,nonatomic)UIView * alertview;//弹框
@property (nonatomic, strong)UILabel *nameLable;//姓名Lable
@property (nonatomic, strong)UILabel *idcardLable;//身份证号lable
@property (nonatomic, strong)UITextField *nameTextFild;//姓名输入框
@property (nonatomic, strong)UITextField *idcardTextFild;//身份证号输入号
@property (nonatomic, strong)UIButton *cancelButton;//取消按钮
@property (nonatomic, strong)UIButton *sureButton;//确定按钮
@property (nonatomic, strong)NSString *name;//原始姓名的参数
@property (nonatomic, strong)NSString *idnumber;//原始身份证号的参数
@property (nonatomic, strong)UILabel *line1Lable;//灰色横线
@property (nonatomic, strong)UILabel *line2Lable;//灰色竖线
@end

@implementation CommonAlertView
- (instancetype)initWithFrame:(CGRect)frame{
    self=[super initWithFrame:frame];
    if (self) {
        _blackView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, LCWINDOWS.width, LCWINDOWS.height+64)];
        _blackView.backgroundColor = [UIColor blackColor];
        _blackView.alpha = 0.5;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(blackClick)];
        tap.enabled=NO;
        [self.blackView addGestureRecognizer:tap];
        [self addSubview:_blackView];
        //创建alert
        self.alertview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 288, 183)];
        self.alertview.center = self.center;
        self.alertview.backgroundColor = [UIColor whiteColor];
        self.alertview.layer.cornerRadius=5.0f;
        [self addSubview:_alertview];
        [self animationAlert:self.alertview];
    }
    return self;
}
//在弹框的view上布局添加子view(如果想改变弹框里面的view样式布局,在此方法中修改)
- (void)layoutSubviews{
    [super layoutSubviews];
    
    _nameLable=[[UILabel alloc]initWithFrame:CGRectMake(10, 20, 68, 30)];
    _nameLable.textAlignment=NSTextAlignmentLeft;
    _nameLable.textColor=[self getColor:@"666666"];
    _nameLable.text=@"姓      名:";
    _nameLable.adjustsFontSizeToFitWidth=YES;
    [self.alertview addSubview:_nameLable];
    _nameTextFild=[[UITextField alloc]initWithFrame:CGRectMake(88, 20, 180, 30)];
    _nameTextFild.textAlignment=NSTextAlignmentLeft;
    _nameTextFild.borderStyle=UITextBorderStyleNone;
    _nameTextFild.layer.borderWidth=1.0f;
    _nameTextFild.layer.borderColor=[self getColor:@"dadada"].CGColor;
    _nameTextFild.textColor=[UIColor blackColor];
    _nameTextFild.secureTextEntry=NO;
    _nameTextFild.delegate=self;
    _nameTextFild.clearButtonMode=UITextFieldViewModeWhileEditing;
    if (self.name.length!=0) {
        _nameTextFild.text=self.name;
    }
    [self.alertview addSubview:_nameTextFild];
    
    _idcardLable=[[UILabel alloc]initWithFrame:CGRectMake(10, CGRectGetMaxY(_nameLable.frame)+33, 68, 30)];
    _idcardLable.textAlignment=NSTextAlignmentLeft;
    _idcardLable.textColor=[self getColor:@"666666"];
    _idcardLable.text=@"身份证号:";
    _idcardLable.adjustsFontSizeToFitWidth=YES;
    
    [self.alertview addSubview:_idcardLable];
    _idcardTextFild=[[UITextField alloc]initWithFrame:CGRectMake(88, CGRectGetMaxY(_nameTextFild.frame)+33, 180, 30)];
    _idcardTextFild.textAlignment=NSTextAlignmentLeft;
    _idcardTextFild.borderStyle=UITextBorderStyleNone;
    _idcardTextFild.layer.borderWidth=1.0f;
    _idcardTextFild.layer.borderColor=[self getColor:@"dadada"].CGColor;
    _idcardTextFild.textColor=[UIColor blackColor];
    _idcardTextFild.secureTextEntry=NO;
    _idcardTextFild.delegate=self;
    _idcardTextFild.clearButtonMode=UITextFieldViewModeWhileEditing;
    if (self.idnumber.length!=0) {
        _idcardTextFild.text=self.idnumber;
    }
    [self.alertview addSubview:_idcardTextFild];
    _line1Lable=[[UILabel alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(_idcardLable.frame)+19, self.alertview.bounds.size.width, 1)];
    _line1Lable.backgroundColor=[self getColor:@"e5e5e5"];
    [self.alertview addSubview:_line1Lable];
    _line2Lable=[[UILabel alloc]initWithFrame:CGRectMake(self.alertview.bounds.size.width/2-0.5, CGRectGetMaxY(_idcardLable.frame)+20, 1, 50)];
    _line2Lable.backgroundColor=[self getColor:@"e5e5e5"];
    [self.alertview addSubview:_line2Lable];
    
    _cancelButton=[UIButton buttonWithType:UIButtonTypeCustom];
    _cancelButton.backgroundColor=[UIColor whiteColor];
    _cancelButton.frame=CGRectMake(0, CGRectGetMaxY(_idcardLable.frame)+20, self.alertview.bounds.size.width/2-0.5, 45);
    [_cancelButton setTitle:@"返  回" forState:UIControlStateNormal];
    [_cancelButton setTitleColor:[self getColor:@"333333"] forState:UIControlStateNormal];
    [_cancelButton setBackgroundColor:[UIColor whiteColor]];
    [_cancelButton addTarget:self action:@selector(cancelBtnClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.alertview addSubview:_cancelButton];
    _sureButton=[UIButton buttonWithType:UIButtonTypeCustom];
    _sureButton.backgroundColor=[UIColor whiteColor];
    _sureButton.frame=CGRectMake(self.alertview.bounds.size.width/2+0.5, CGRectGetMaxY(_idcardTextFild.frame)+20, self.alertview.bounds.size.width/2, 45);
    [_sureButton setTitle:@"修  改" forState:UIControlStateNormal];
    [_sureButton setBackgroundColor:[UIColor whiteColor]];
    [_sureButton setTitleColor:[self getColor:@"f4b249"] forState:UIControlStateNormal];
    [_sureButton addTarget:self action:@selector(sureBtnClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.alertview addSubview:_sureButton];
    
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    return YES;
}
//背景遮罩加点击手势,不做任何的处理
- (void)blackClick{
    
}
//创建
+(instancetype)alertViewWithCancelbtnClicked:(cancelBlock) cancelBlock andSureBtnClicked:(sureBlock) sureBlock withName:(NSString *)name withidcard:(NSString *)idnumber{
    CommonAlertView *alertView=[[CommonAlertView alloc]initWithFrame:CGRectMake(0, 0, LCWINDOWS.width,LCWINDOWS.height)];
    alertView.center=CGPointMake(LCWINDOWS.width/2, LCWINDOWS.height/2-64);//view的中点
    alertView.cancel_block=cancelBlock;//取消block
    alertView.sure_block=sureBlock;//确定block
    alertView.name=[NSString stringWithFormat:@"%@",name];//将传入的姓名参数接收
    alertView.idnumber=[NSString stringWithFormat:@"%@",idnumber];//将传入的身份证号参数接收
    
    return alertView;
    
}
//name字符串属性重写(注意:NSString类型的属性都要重写,不然会出现无法显示到界面的情况)
- (void)setName:(NSString *)name{
    
    _name=[NSString stringWithFormat:@"%@",name];
}
//idnumber字符串属性重写
- (void)setIdnumber:(NSString *)idnumber{
    
    _idnumber=[NSString stringWithFormat:@"%@",idnumber];
}
//取消按钮点击
- (void)cancelBtnClicked{
    [UIView animateWithDuration:0.3 animations:^{
        self.alpha=0;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
        self.alertview=nil;
        self.cancel_block();
    }];
    
    
}
//确定按钮点击
- (void)sureBtnClicked{
    //如果输入的姓名和身份证号不符合正则表达式,则return;(这里不做验证,请根据项目需求修改)
    [UIView animateWithDuration:0.3 animations:^{
        self.alpha=0;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
        self.alertview=nil;
        //将新输入的姓名和身份证号值传出去.
        self.sure_block(_nameTextFild.text,_idcardTextFild.text);
    }];
    
}

//弹框动画自定义(可以修改参数改变动画)
- (void)animationAlert:(UIView *)view{
    CAKeyframeAnimation *popAnimation=[CAKeyframeAnimation animationWithKeyPath:@"transform"];
    popAnimation.duration=0.6;
    popAnimation.values=@[[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.01f, 0.01f, 1.0f)],[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1f, 1.1f, 1.0f)],[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9f, 0.9f, 1.0f)],[NSValue valueWithCATransform3D:CATransform3DIdentity]];
    popAnimation.keyTimes=@[@0.0f,@0.5f,@0.75f];
    popAnimation.timingFunctions=@[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    [view.layer addAnimation:popAnimation forKey:nil];
    
}
//十六进制颜色转换
- (UIColor *)getColor:(NSString*)hexColor
{
    unsigned int red,green,blue;
    NSRange range;
    range.length = 2;
    
    range.location = 0;
    [[NSScanner scannerWithString:[hexColor substringWithRange:range]]scanHexInt:&red];
    
    range.location = 2;
    [[NSScanner scannerWithString:[hexColor substringWithRange:range]]scanHexInt:&green];
    
    range.location = 4;
    [[NSScanner scannerWithString:[hexColor substringWithRange:range]]scanHexInt:&blue];
    
    return [UIColor colorWithRed:(float)(red/255.0f)green:(float)(green / 255.0f) blue:(float)(blue / 255.0f)alpha:1.0f];
}
@end

调用,在viewController.m中导入CommonAlertView.h并调用方法,代码如下:

#import "ViewController.h"
#import "CommonAlertView.h"
@interface ViewController ()
{
    NSString *oriName;
    NSString *oriIdnumber;

}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    oriName=@"luochuanAD";
    oriIdnumber=@"110110110110";
    
}
- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    CommonAlertView *alertView=[CommonAlertView alertViewWithCancelbtnClicked:^{
        
    } andSureBtnClicked:^(NSString *name, NSString *idnumber) {
        NSLog(@"-------确定按钮点击后 姓名和身份证号参数----%@,%@",name,idnumber);
        //保存修改后的姓名和身份证号
        oriName=name;
        oriIdnumber=idnumber;
        
    } withName:oriName withidcard:oriIdnumber];
    UIView *keywindow=[UIApplication sharedApplication].keyWindow;
    [keywindow addSubview:alertView];
}

@end

代码分析;

CommonAlertView.h中定义了弹框的返回和修改按钮的Block用来处理按钮的点击事件. 点击修改按钮需要将姓名和身份证号的值传出去,所以修改按钮的block会有2个参数(注:根据你项目的需求,修改参数的多少). 接下来,就是创建自意义View的方法,我用类方法,带有4个参数:2个是弹框的返回和修改按钮事件的block,和从ViewController中传入的要显示在弹框的姓名和身份证号参数.



alertview

 中就是添加控件,布局和处理按钮的点击事件.

现在看一下自定义Alert的层级:


initWithFrame:

我在 CommonAlertView.m
中的initWithFrame:方法中中创建遮罩blackView和弹框alertView,同时给alertview的加上弹出的动画(注:这里的动画可自定义,方法为animationAlert:). 

在layoutSubviews的方法中添加控件到弹框alertView上并布局.

代码片段如下:


initWithFrame:



+(instancetype)alertViewWithCancelbtnClicked:(cancelBlock) cancelBlock andSureBtnClicked:(sureBlock) sureBlock withName:(NSString *)name withidcard:(NSString *)idnumber中定义2个NSString属性分别接收name和idnumber的值,并对定义的2个属性重写,否则会无法显示. 


在返回和修改按钮的点击事件中将block块传出去.在修改按钮的事件中要将姓名和身份证号的输入框中的值带入到sure_block中.

http://

二,结束语

这个自定义alertView很简单. 同时我的语言组织的不好,请原谅,这是我几年来第一次写博客.见笑了.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值