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

UIButton+Block

时间:2015-09-17 15:09:24      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

UIButton的一个Category,使用block处理UIControlEvent事件,如常用的TouchUpInside等。
代码非原创,也是从网上看到的,用到了实际项目中,目前还没发现什么问题。

UIButton+Block.h:

 1 #import <UIKit/UIKit.h>
 2 #import <objc/runtime.h>
 3 
 4 typedef void (^ActionBlock)();
 5 
 6 @interface UIButton (Block)
 7 
 8 /**
 9  *  UIButton添加UIControlEvents事件的block
10  *
11  *  @param event 事件
12  *  @param action block代码
13  */
14 - (void) handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock)action;
15 
16 @end

UIButton+Block.m:

 1 #import "UIButton+Block.h"
 2 
 3 @implementation UIButton (Block)
 4 
 5 static char eventKey;
 6 
 7 /**
 8  *  UIButton添加UIControlEvents事件的block
 9  *
10  *  @param controlEvent 事件
11  *  @param action block代码
12  */
13 - (void) handleControlEvent:(UIControlEvents)event withBlock:(void (^)())action {
14     objc_setAssociatedObject(self, &eventKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC);
15     [self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
16 }
17 
18 - (void)callActionBlock:(id)sender {
19     ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &eventKey);
20     if (block) {
21         block();
22     }
23 }
24 
25 @end

具体使用:

1 - (void)viewDidLoad {
2     [super viewDidLoad];
3     // Do any additional setup after loading the view, typically from a nib.
4     
5     [self.button handleControlEvent:UIControlEventTouchUpInside withBlock:^{
6        
7         NSLog(@"button touched!");
8     }];
9 }

附上demo,这里是链接地址

另外,毕竟是用到了objc_setAssociatedObject动态关联,虽然不知道有没有什么性能影响,但是个人感觉最好不要滥用,比如Button的点击事件里代码量较大时最好还是用原生的处理方法。
如果UIButton是动态创建的,且事件处理逻辑较少(比如就几行代码 ),我觉得还是可以使用。我目前是用在自定义导航栏按钮上。

 

UIButton+Block

标签:

原文地址:http://www.cnblogs.com/manji/p/4816365.html

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