「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和主题,开发者就可以很方便 ...
随机推荐
- 6个变态的C语言Hello World程序
6个变态的C语言Hello World程序 下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C+ ...
- TraceView进行性能分析
一.TraceView概述 TraceView 是 Android 平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到 method. 详细内容参考 ...
- mysql创建定时任务
一.前言 自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作 ...
- PHP 基础(赋值及函数)
开端<?php>结尾</php> 弱类型语言 定义变量的时候 不需要 声明 但是 每一个变量前 都必须 加$ 符号 储存文件按 统一放到 安装文件夹下面的 WA ...
- NSURLConnection 异步加载网络数据
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- AlertDialog对话框简单案例
什么是Dialog? Dialog类,是一切对话框的基类,需要注意的是,Dialog类虽然可以在界面上显示,但是并非继承于View类,而是直接从java.lang.Object开始构造出的.类似于Ac ...
- Node.js学习之简介
1.简单的说Node.js就是运行在服务端的javaScript: 2.Node.js是一个基于Chrome javaScript运行时建立的一个平台: 3.Node.js是一个事件驱动I/O服务端J ...
- 2016 Multi-University Training Contest 2
8/13 2016 Multi-University Training Contest 2官方题解 数学 A Acperience(CYD)题意: 给定一个向量,求他减去一个 α(>=0)乘以 ...
- Excel大批量导入数据到SQLServer数据库-万条只用1秒
private string ExcelToStudent() { /*---*/ var preStr = DateTime.Now.ToString("yyyyMMddHHmmssfff ...
- NOI 题库 8465
8465 马走日 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...