「iOS造轮子」之UIButton 用Block响应事件
俗语说 一个不懒的程序员不是好程序员
造轮子,也只是为了以后更好的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响应事件的更多相关文章
- 使用关联对象(AssociatedObject)为UIButton添加Block响应
在开发中,要给UIButton添加点击事件的话,通常的做法是这样的 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [ ...
- UIActivityIndicatorView添加到UIButton上并响应事件
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewSty ...
- 「造个轮子」——cicada(轻量级 WEB 框架)
前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...
- React造轮子:拖拽排序组件「Dragact」
先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...
- 「造个轮子」——cicada 设计一个配置模块
前言 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口.路由的配置. 因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议. 最终其实还是按照我之前的想法来做了 ...
- 「造个轮子」——cicada 源码分析
前言 两天前写了文章<「造个轮子」--cicada(轻量级 WEB 框架)> 向大家介绍了 cicada 之后收到很多反馈,也有许多不错的建议. 同时在 GitHub 也收获了 80 几颗 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。
1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...
随机推荐
- servlet 之 复习
servlet 他是我们第一个动态资源,servlet和JSP都是. servlet ===> server applet 运行在服务器端的小程序. 1.获得请求 2.处理请求 3.完成响应 s ...
- 十二天 mysql操作
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...
- HDU 4859 海岸线(最大流最小割)
难得的中文题,就不翻译了. 输入第一行为T,表示有T组测试数据.每组数据以两个整数N和M开始,表示地图的规模.接下来的N行,每一行包含一个长度为M的字符串,表示地图,‘.’表示陆地,’E’表示浅海域, ...
- ul、li分列显示
目的很简单:有一个 ul>li 列表,默认为单列显示,把它变为两列显示. 方法1,使用DIV+CSS代码: <style type="text/css"> .my ...
- iOS离屏渲染简书
更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...
- VR技术的系统化实现阶段
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 从20世纪80年代至80年代中期,虚拟现实技术的基本概念开始逐渐形成和完善.这一时期出现了一些比较经典的 ...
- sqlserver 分离和附加
1.何为数据库分离和附加 数据库分离: 分离数据库就是将某个数据库(如student_Mis)从SQL Server数据库列表中删除,使其不再被SQL Server管理和使用,但该数据库的文件(.MD ...
- 【leetcode】Simplify Path
题目简述: Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/& ...
- JavaScript Bind()趣味解答 包懂~~
首先声明一下,这个解答是从Segmentfault看到的,挺有意思就记录下来.我放到最下面: bind() https://developer.mozilla.org/zh-CN/docs/Web/J ...
- 使用lnmp一键安装包后yum源出现的问题与解决
遇到一个问题就是执行 Yum update 或使用yum安装软件等命令的时候会有一个链接报404,使用find查找到该链接与kbsingh-CentOS-Extras.repo这个包有关,删除后yum ...