首页 技术 正文
技术 2022年11月13日
0 收藏 520 点赞 3,579 浏览 1590 个字

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

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

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

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

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

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

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

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

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

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

实际上是这样的

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

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

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

增加block式响应 步骤如下

首先建立UIButton的Category

添加 实例方法

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

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

然后再加入存放Block的Property

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

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

在.m中,引入

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Menlo; color: #ff4647}
span.s1 {font-variant-ligatures: no-common-ligatures}
–>

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,对应响应即可

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,983
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,500
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,344
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,127
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,761
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,838