转载

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

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

其运行效果如下:

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

(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.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

其运行效果如下:

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

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 *)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.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

其运行效果如下:

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

正文到此结束
Loading...