首页 > 学院 > 开发设计 > 正文

UIButton+Block

2019-11-14 18:18:57
字体:
来源:转载
供稿:网友

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事件的block10  *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是动态创建的,且事件处理逻辑较少(比如就几行代码 ),我觉得还是可以使用。我目前是用在自定义导航栏按钮上。

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表