标签:
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 // 调用此方法以触发block 22 [self addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside]; 23 } 24 return self; 25 } 26 27 - (void)clickAction:(MyBlockButton *)button 28 { 29 _block(button); 30 } 31 32 @end
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 // 自定义方法,调用block 10 - (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 *)button 13 { 14 _block(button); 15 } 16 17 @end
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
其运行效果如下:
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 *)title 11 message:(NSString *)message 12 delegate:(id)delegate 13 cancelButtonTitle:(NSString *)cancelButtonTitle 14 otherButtonTitles:(NSString *)otherButtonTitles 15 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)buttonIndex 17 { 18 _block(buttonIndex); 19 } 20 21 @end
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
其运行效果如下:
用block改写UIButton点击事件和UIAlerView的按钮点击代理方法
标签:
原文地址:http://www.cnblogs.com/zzq1580443149/p/4802704.html