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

UIButton+Block.h:

 #import <UIKit/UIKit.h>
#import <objc/runtime.h> typedef void (^ActionBlock)(); @interface UIButton (Block) /**
* UIButton添加UIControlEvents事件的block
*
* @param event 事件
* @param action block代码
*/
- (void) handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock)action; @end

UIButton+Block.m:

 #import "UIButton+Block.h"

 @implementation UIButton (Block)

 static char eventKey;

 /**
* UIButton添加UIControlEvents事件的block
*
* @param controlEvent 事件
* @param action block代码
*/
- (void) handleControlEvent:(UIControlEvents)event withBlock:(void (^)())action {
objc_setAssociatedObject(self, &eventKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
} - (void)callActionBlock:(id)sender {
ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &eventKey);
if (block) {
block();
}
} @end

具体使用:

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

附上demo,这里是链接地址

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

 

UIButton+Block的更多相关文章

  1. 第十篇、自定义UIBarButtonItem和UIButton block回调

    // 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...

  2. UIButton之Block回调

    本文主要介绍了两种改写UIButton的点击事件方法——继承UIButton跟给UIButton添加一个分类.附代码 方法一:继承UIButton UIButtonBlock.h文件 如下 #impo ...

  3. 使用关联对象(AssociatedObject)为UIButton添加Block响应

    在开发中,要给UIButton添加点击事件的话,通常的做法是这样的 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [ ...

  4. runtime运行机制方法学习

    runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开 ...

  5. iOS objc_setAssociatedObject 关联对象的学习

    今天看了FDTemplateLayoutCell的源码,类别里面相当频繁使用了关联对象,做笔记!!!学套路 主要函数: void objc_setAssociatedObject(id object, ...

  6. 「iOS造轮子」之UIButton 用Block响应事件

    俗语说 一个不懒的程序员不是好程序员 造轮子,也只是为了以后更好的coding. coding,简易明了的代码更是所有程序员都希望看到的 无论是看自己的代码,还是接手别人的代码 都希望一看都知道这代码 ...

  7. UIButton的两种block传值方式

    UIButton的两种block传值方式 方式1 - 作为属性来传值 BlockView.h 与 BlockView.m // // BlockView.h // Block // // Create ...

  8. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  9. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

随机推荐

  1. 利用dd命令制作u盘iso镜像

    现在安装系统都是用u盘安装,那么制作u盘的iso镜像就是必须的了.现在此类工具倒是不少,但是,好用的不多,有的还收费.唉,还是用dd吧,老配方,老味道. 首先:要df -h一下,看看u盘的盘符,类似  ...

  2. SVN使用(自己总结)

    1.第一次导入,注意要新建个readme.txt文件用于记录版本更改,每次导入时 要填写import message 2.第二次增加文件导入时 勾选未受控版本文件(新增加文件) 完成上传就可更新增加的 ...

  3. Form.ShowWithoutActivation 属性

    获取一个值,该值指示显示窗口时是否激活它. 命名空间:  System.Windows.Forms程序集:  System.Windows.Forms(在 System.Windows.Forms.d ...

  4. redis命令_SETEX

    SETEX key seconds value 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位). 如果 key 已经存在, SETEX 命令将覆写旧值 ...

  5. 使用tar+lz4/pigz+ssh更快的数据传输

    使用tar+lz4/pigz+ssh更快的数据传输 -- | :41分类:Linux,MySQL | 前面一篇介绍了如何最大限度的榨取SCP的传输速度,有了这个基础,就可以进一步的使用压缩来加速传输速 ...

  6. iOS开发多线程篇 04 —线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

  7. django中使用POST方法 使用ajax后出现“CSRF token missing or incorrect”

    这个是因为在django的ajax中默认添加了token,因此需要在cookie中增加token头信息. 首先使用JavaScript函数获取token: function getCookie(nam ...

  8. [转]c++ 为什么要将基类的析构函数声明为Virtual?

    http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/12/2721410.html

  9. js arguments 内置对象

    1.arguments是js的内置对象. 2.在不确定对象是可以用来重载函数. 3.用法如下: function goTo() { var i=arguments.length; alert(i); ...

  10. Challenge-2.1.4 部分和问题

    部分和问题 描写叙述 给定整数a1.a2........an.推断能否够从中选出若干数,使它们的和恰好为K. 输入 首先,输入n.表示数的个数. 接着一行n个数. (1<=n<=20,保证 ...