码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-09-12 12:13:28      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

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         // 调用此方法以触发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.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 // 自定义方法,调用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


其运行效果如下:

技术分享

技术分享

 

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的按钮点击代理方法

标签:

原文地址:http://www.cnblogs.com/zzq1580443149/p/4802704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!