俗语说 一个不懒的程序员不是好程序员

造轮子,也只是为了以后更好的coding。

coding,简易明了的代码更是所有程序员都希望看到的

无论是看自己的代码,还是接手别人的代码 都希望一看都知道这代码是干嘛的。。

UI开发中用得最多的控件之一的UIButton,大家都知道其继承于UIControl,即带响应事件的UIView

点击事件的添加大家都知道是通过

    [buttonObj addTarget:target action:SEL forControlEvents:controlEvents];

这么一句代码来实现,在SEL中选择的方法响应

后面编码为了代码看上去好看一点(偷懒) 改成了Block式响应

这个Block响应会在什么时候使用呢?如果处理的内容比较简单的话是无妨的,而且不需要作为外部方法被调用

实际上是这样的

上面注释掉的是原来添加响应的方式,下面则是block式响应

有个不好的是要处理好循环引用的问题

增加block式响应 步骤如下

首先建立UIButton的Category

添加 实例方法

- (void)addActionBlock:(void(^)())block forControlEvents:(UIControlEvents)controlEvents;

这里的Block 大家可以根据需要来加入回调参数,都是随大家的。。

然后再加入存放Block的Property

@property (copy,nonatomic) void(^actionBlock)();

显然,在Category下无法直接添加Property,这里又需要通过Runtime来做相应的设置了:

在.m中,引入

objc/runtime.h

并实现set和get方法

- (void)setActionBlock:(void (^)())actionBlock{
objc_setAssociatedObject(self, @selector(actionBlock), actionBlock, OBJC_ASSOCIATION_COPY);
}
- (void (^)())actionBlock{
return objc_getAssociatedObject(self, _cmd);
}

然后实现刚声明的addActionBlock方法

- (void)addActionBlock:(void(^)())block forControlEvents:(UIControlEvents)controlEvents{
self.actionBlock = [block copy]; /** 将方法中的Block拿下 */
[self addTarget:self action:@selector(__startAction:) forControlEvents:controlEvents]; /** 添加一个事件 */
}

响应:

- (void)__startAction:(UIButton *)sender{
if (self.actionBlock) self.actionBlock();
}

这就完成了一个事件的响应

后面就可以直接通过

- (void)addActionBlock:(void(^)())block forControlEvents:(UIControlEvents)controlEvents;

来添加这个响应事件了

但是 请注意

由于property中的block 只有1个!!!在设置多个event的时候,原来设置的block会被覆盖

那么这种情况该如何解决呢?

傻瓜一点的方法:

不同event分别添加不同的action和block,对应响应即可

「iOS造轮子」之UIButton 用Block响应事件的更多相关文章

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

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

  2. UIActivityIndicatorView添加到UIButton上并响应事件

    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewSty ...

  3. 「造个轮子」——cicada(轻量级 WEB 框架)

    前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...

  4. React造轮子:拖拽排序组件「Dragact」

    先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...

  5. 「造个轮子」——cicada 设计一个配置模块

    前言 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口.路由的配置. 因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议. 最终其实还是按照我之前的想法来做了 ...

  6. 「造个轮子」——cicada 源码分析

    前言 两天前写了文章<「造个轮子」--cicada(轻量级 WEB 框架)> 向大家介绍了 cicada 之后收到很多反馈,也有许多不错的建议. 同时在 GitHub 也收获了 80 几颗 ...

  7. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  8. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  9. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

随机推荐

  1. 关于Hibernate 的数据库配置

    <hibernate-configuration>    <session-factory name="mySessionFactory">        ...

  2. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  3. /sbin/insserv: No such file or directory

    /sbin/insserv: No such file or directory在Ubuntu下安装service服务,可能会报如下错误:/sbin/insserv: No such file or ...

  4. 来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

  5. 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装OpenCV(离线方式和在线方式)(图文详解)

    不多说,直接上干货! 说明: Anaconda2-5.0.0-Windows-x86_64.exe安装下来,默认的Python2.7 Anaconda3-4.2.0-Windows-x86_64.ex ...

  6. [luogu3157][bzoj3295][CQOI2011]动态逆序对【cdq分治+树状数组】

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

  7. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  8. 作业6-COSPLAY孩子他家长

    为了我提高我女儿的数学能力,我以下我会根据我想要的功能做出相应的解决方案,为了孩子,父母也可以想的比老师周到.可怜天下父母心. 编号.          名称.                     ...

  9. Python中xlrd和xlwt模块读写Excel的方法

    本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 着重掌握读取操作,因为实际工作中读取excel用得比较 ...

  10. 解题:NOI 2014 随机数生成器

    题面 为什么NOI2014有模拟题=.=??? 按题意把序列生成出来之后,对每一行维护一个能取到的最左侧和能取到的最右侧.从小到大$O(n^2)$枚举数字看看能否填入,能填入则暴力$O(n)$更新信息 ...