你的位置:首页 > 操作系统

[操作系统]用block改写UIButton点击事件和UIAlerView的按钮点击代理方法


1.用block改写UIButton点击事件
在这里给给出两种方式.
(1)自定义BlockButton,在初始化的时候给出按钮的样式(自定义)
自定义一个BlockButton继承UIButton,然后在里面用
addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
这个方法触发block.
 
MyBlockButton.h
 1 #import <UIKit/UIKit.h> 2  3 @class MyBlockButton;   // 此处一定要声明 4 typedef void(^TouchBlock)(MyBlockButton *button); 5  6 @interface MyBlockButton : UIButton 7  8 @property (copy, nonatomic) TouchBlock block; 9 10 @end  

 

MyBlockButton.m

 1 #import "MyBlockButton.h" 2  3 @implementation MyBlockButton 4  5 -(instancetype)initWithFrame:(CGRect)frame 6 { 7   self = [super initWithFrame:frame]; 8    9   if (self) {10     // 按钮边框美化11     self.layer.borderWidth = 1;12     self.layer.borderColor = [UIColor lightGrayColor].CGColor;13     self.layer.cornerRadius = 3;14     self.layer.masksToBounds = YES;15     16     // 为按钮添加阴影17     self.layer.shadowColor = [UIColor blackColor].CGColor;18     self.layer.shadowOffset = CGSizeMake(3, 3);19     self.layer.shadowRadius = 3;20     21     // 调用此方法以触发block22     [self addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside];23   }24   return self;25 }26 27 - (void)clickAction:(MyBlockButton *)button28 {29   _block(button);30 }31 32 @end

 

ViewController.h里面没有添加任何代码

ViewController.m

 1 #import "ViewController.h" 2 #import "MyBlockButton.h" 3  4 @interface ViewController () 5  6 @end 7  8 @implementation ViewController 9 10 - (void)viewDidLoad {11   [super viewDidLoad];12   13   // 创建一个"确定按钮"14   MyBlockButton *button = [[MyBlockButton alloc]initWithFrame:CGRectMake(35, 100, 260, 30)];15   [button setTitle:@"确定" forState:UIControlStateNormal];16   [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];17   button.backgroundColor = [UIColor orangeColor];18   [button setBlock:^(MyBlockButton *blockButton) {19     NSLog(@"按钮被点击了");20   }];21   [self.view addSubview:button];22   23   // 创建三个数字按钮24   for (int i = 1; i <= 3; i ++) {25     MyBlockButton *btn = [[MyBlockButton alloc]initWithFrame:CGRectMake(70 * i, 200, 60, 30)];26     [btn setTitle:[NSString stringWithFormat:@"%d",i] forState:UIControlStateNormal];27     [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];28     btn.backgroundColor = [UIColor redColor];29     btn.block = ^(MyBlockButton *blockBtn) {30       NSLog(@"按钮%d被点击了",i);31     };32     33     [self.view addSubview:btn];34   }35 }36 37 - (void)didReceiveMemoryWarning {38   [super didReceiveMemoryWarning];39   // Dispose of any resources that can be recreated.40 }41 42 @end

其运行效果如下:

 

(2)接下来给出的方法中,使用自定义方法调用block;继承自UIButton,在初始化使用的时候还需要设置其样式.

MyButtonBlock.h

 1 #import <UIKit/UIKit.h> 2  3 typedef void(^TouchBlock)(UIButton *button); 4  5 @interface MyButtonBlock : UIButton 6  7 @property (copy, nonatomic) TouchBlock block; 8  9 // 自定义方法,调用block10 - (void)clikAction:(TouchBlock)block;11 12 @end

 

MyButtonBlock.m

 1 #import "MyButtonBlock.h" 2  3 @implementation MyButtonBlock 4  5 - (void)clikAction:(TouchBlock)block 6 { 7   _block = block; 8   // 调用此方法以触发block 9   [self addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];10 }11 12 - (void)clickButton:(UIButton *)button13 {14   _block(button);15 }16 17 @end

 

ViewController.h里面没有添加任何代码

ViewController.m

 1 #import "ViewController.h" 2 #import "MyButtonBlock.h" 3  4 @interface ViewController () 5  6 @end 7  8 @implementation ViewController 9 10 - (void)viewDidLoad {11   [super viewDidLoad];12   13   MyButtonBlock *buttonBlock = [MyButtonBlock buttonWithType:UIButtonTypeCustom];14   buttonBlock.frame = CGRectMake(35, 100, 300, 30);15   [buttonBlock setTitle:@"确定" forState:UIControlStateNormal];16   [buttonBlock setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];17   buttonBlock.backgroundColor = [UIColor orangeColor];18 19   [buttonBlock clikAction:^(UIButton *button) {20     NSLog(@"按钮被点击了!");21   }];22   23   [self.view addSubview:buttonBlock];24 }25 26 - (void)didReceiveMemoryWarning {27   [super didReceiveMemoryWarning];28   // Dispose of any resources that can be recreated.29 }30 31 @end


其运行效果如下:

 

2.用block改写UIButton点击事件和UIAlerView的代理
下面再改写Alert这个控件,思路与改写UIButton的点击事件的第二种方法是一样的,在自定义的Alert里面用block触发点击事件,而在Alert定义的代码里执行事件触发的行为.
MyAlertViewBlock.h
 1 #import <UIKit/UIKit.h> 2  3 typedef void(^TouchBlock)(NSInteger buttonIndex); 4  5 @interface MyAlertViewBlock : UIAlertView 6  7 @property (copy, nonatomic) TouchBlock block; 8  9 // 自定义初始化方法10 - (instancetype)initWithTitle:(NSString *)title11            message:(NSString *)message12           delegate:(id)delegate13       cancelButtonTitle:(NSString *)cancelButtonTitle14       otherButtonTitles:(NSString *)otherButtonTitles15         andTouchBlock:(TouchBlock)block;16 17 @end

 

MyAlertViewBlock.m

 

 1 #import "MyAlertViewBlock.h" 2  3 @implementation MyAlertViewBlock 4  5 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles andTouchBlock:(TouchBlock)block 6 { 7   // 先初始化父类的方法 8   self = [super initWithTitle:title message:message delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil]; 9   if (self) {10     self.block = block;11   }12   return self;13 }14 15 #pragma mark - UIAlertViewDelegate(这只是一个提示,不需要签订代理协议)16 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex17 {18   _block(buttonIndex);19 }20 21 @end

 

ViewController.h里面没有添加任何代码

ViewController.m

 1 #import "ViewController.h" 2 #import "MyAlertViewBlock.h" 3  4 @interface ViewController () 5  6 @end 7  8 @implementation ViewController 9 10 - (void)viewDidLoad {11   [super viewDidLoad];12   13   UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];14   button.frame = CGRectMake(35, 100, 260, 30);15   button.backgroundColor = [UIColor orangeColor];16   [button setTitle:@"确定" forState:UIControlStateNormal];17   [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];18   [button addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside];19   [self.view addSubview:button];20 }21 22 - (void)clickAction:(UIButton *)button {23   MyAlertViewBlock *alertView = [[MyAlertViewBlock alloc]initWithTitle:@"测试" message:@"将UIAlertView的按钮点击事件代理用block实现" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定" andTouchBlock:^(NSInteger buttonIndex) {24     if (buttonIndex == 0) {25       NSLog(@"取消");26     } else if (buttonIndex == 1) {27       NSLog(@"确定");28     }29   }];30   31   [alertView show];32 }33 34 @end

其运行效果如下: