文档章节

runtime实现按钮点击事件

RainOrz
 RainOrz
发布于 06/25 17:52
字数 285
阅读 20
收藏 0

也不能说是实现吧,,,就是有点类似于RAC里边的写法,不用给btn添加另外的点击事件,就那个add...select...这样子很不友好,来看下代码:

[self.btn handleControlEvent:UIControlEventTouchUpInside withBlock:^{
        NSLog(@"2%@",click);
    }];

差不多就是这个意思,当然了,此处还是预留了event,RAC直接连这个都没了,具体可以看这里

那么,问题来了,怎么实现呢?

首先,我们对系统的的UIButton做一个category,

然后,写点击事件:

.h

#import <UIKit/UIKit.h>

typedef void(^ActionBlock)(void);

@interface UIButton (ClickBlock)

- (void)handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock)block;

@end

.m

#import "UIButton+ClickBlock.h"
#import <objc/runtime.h>

@implementation UIButton (ClickBlock)
- (void)handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock)block
{
    if(!event)
        event=UIControlEventTouchUpInside;
    objc_setAssociatedObject(self, &"myBlock", block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(blockEvent:) forControlEvents:event];
    
}
-(void)blockEvent:(UIButton *)sender
{
    ActionBlock block=objc_getAssociatedObject(self, &"myBlock");
    if(block)
    {
        block();
    }
}

此处只是demo哈!

这样子我们就可以按照之前的思路,写出来不分离的btnclick了

© 著作权归作者所有

共有 人打赏支持
RainOrz
粉丝 8
博文 130
码字总数 88426
作品 0
青浦
程序员
私信 提问
iOS UIButton之防止重复点击(控制事件响应时间间隔)

级别:★★☆☆☆ 标签:「UIButton Runtime」「UIButton点击频率」「UIButton防止多次点击」 作者: Xs·H 审校: QiShare团队 有几个实际业务场景需要控制响应事件的时间间隔。比如: 1、当...

QiShare
08/08
0
0
响应者链UIResponder-扩大UIButton的点击范围

在开发中,我们经常看到有按钮等的点击,会出现响应事件。按钮->view->ViewController->UIWindow->UIApplication,这就形成了一个响应链。本篇将讲述响应链的具体底层实现,大约花费10-15分钟...

国孩
07/28
0
0
Swift中优雅的为UIButton添加链式的Block点击事件

UIButton是基于 action - target 的事件机制处理点击事件的。通常,如果我们需要添加一个 UIButton 的点击事件的时候,一般会这么做: 当然,可能对于同一个 button 我们可能会添加不止一个状...

BennyLoo
04/14
0
0
iOS UIButton 防止连续点击

防止 UIButton 的连续点击,无非就是网上那三种方法,前两种即手动设置 isEnabled、或者在点击的时候取消未执行的事件,再延时执行。这里重点说一下第三种,即重写 load 方法,在 load 方法的...

深度码农患者
05/22
0
0
iOS runtime 关联对象(Associated Object)

需求 同一个类有多个alertView, 不同的alertView 点击确定按钮 执行的方法不同 alertOne 点击 确定按钮 执行 methodOne, alertTwo 点击确定按钮 执行 methodTwo 常规做法 初始化并显示 al...

Carson6931
2015/09/14
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 教程:在 Confluence 中导航

当你对 Confluence 有所了解后,你会发现 Confluence 使用起来非常简单。这个教程主要是针对你使用的 Confluence 界面进行一些说明,同时向你展示在那里可以进行一些通用的任务和操作。 空间...

honeymose
今天
2
0
sed, awk 练习

1. sed打印某行到某行之间的内容 2. sed 转换大小写 将单词首字母转化大写 将所有小写转化大写 3. sed 在某一行最后面添加一个数字 4. 删除某行到最后一行 解析: {:a;N;$!ba;d} :a : 是...

Fc丶
今天
2
0
babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
今天
1
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部