ios UIButton点击快捷回调

简介: ios UIButton点击快捷回调

前言


我又来偷懒来了,

UIButton同样也是我们经常使用到的控件,那么常规我们为按钮绑定点击事件都是写一个方法,然后绑定这样子,一如既往我还是比较喜欢东西放在一起找起来也方便,于是有了下面的封装处理 之前写过一篇UIView的手势点击,这两基本就解决了大部分常规的点击处理


iOS UIView添加手势回调 . 将偷懒进行到底 - -|


. Demo地址


API


/// 添加点击事件,默认UIControlEventTouchUpInside
- (void)kj_addAction:(KJButtonBlock)block;
/// 添加事件,不支持多枚举形式
- (void)kj_addAction:(KJButtonBlock)block forControlEvents:(UIControlEvents)controlEvents;


常规对比


常规做法

[_button addTarget:self action:@selector(action) forControlEvents:(UIControlEventTouchUpInside)];
[_button addTarget:self action:@selector(action2) forControlEvents:(UIControlEventTouchDown)];
/// Action
- (void)action{
    NSLog(@"UIControlEventTouchUpInside");
}
- (void)action2{
    NSLog(@"UIControlEventTouchDown");
}

封装之后做法

[_button kj_addAction:^(UIButton * _Nonnull kButton) {
    NSLog(@"UIControlEventTouchUpInside");
}];
[_button kj_addAction:^(UIButton * _Nonnull kButton) {
    NSLog(@"UIControlEventTouchDown");
} forControlEvents:(UIControlEventTouchDown)];
------- 🎈 给我点赞 🎈 -------
编译时间:16:51:45
文件名:KJButtonVC.m
方法名:-[KJButtonVC button]_block_invoke_2
行号:128
打印信息:UIControlEventTouchDown
------- 🎈 给我点赞 🎈 -------
编译时间:16:51:45
文件名:KJButtonVC.m
方法名:-[KJButtonVC button]_block_invoke
行号:125
打印信息:UIControlEventTouchUpInside


简单介绍


1. 暂时支持UIControlEvents九种类型


static NSString * const _Nonnull KJButtonControlEventsStringMap[] = {
    [UIControlEventTouchDown]        = @"KJ_X_UIControlEventTouchDown",
    [UIControlEventTouchDownRepeat]  = @"KJ_X_UIControlEventTouchDownRepeat",
    [UIControlEventTouchDragInside]  = @"KJ_X_UIControlEventTouchDragInside",
    [UIControlEventTouchDragOutside] = @"KJ_X_UIControlEventTouchDragOutside",
    [UIControlEventTouchDragEnter]   = @"KJ_X_UIControlEventTouchDragEnter",
    [UIControlEventTouchDragExit]    = @"KJ_X_UIControlEventTouchDragExit",
    [UIControlEventTouchUpInside]    = @"KJ_X_UIControlEventTouchUpInside",
    [UIControlEventTouchUpOutside]   = @"KJ_X_UIControlEventTouchUpOutside",
    [UIControlEventTouchCancel]      = @"KJ_X_UIControlEventTouchCancel",
};


2. 事件响应方法处理


我喜欢偷懒所以采用宏的方式处理

#define KJButtonAction(name) \
- (void)kj_action##name{ \
KJButtonBlock block = objc_getAssociatedObject(self, _cmd);\
if (block) block(self);\
}
/// 事件响应方法
KJButtonAction(KJ_X_UIControlEventTouchDown);
KJButtonAction(KJ_X_UIControlEventTouchDownRepeat);
KJButtonAction(KJ_X_UIControlEventTouchDragInside);
KJButtonAction(KJ_X_UIControlEventTouchDragOutside);
KJButtonAction(KJ_X_UIControlEventTouchDragEnter);
KJButtonAction(KJ_X_UIControlEventTouchDragExit);
KJButtonAction(KJ_X_UIControlEventTouchUpInside);
KJButtonAction(KJ_X_UIControlEventTouchUpOutside);
KJButtonAction(KJ_X_UIControlEventTouchCancel);


3. kj_addAction:forControlEvents:


事件处理

/// 添加点击事件,默认UIControlEventTouchUpInside
- (void)kj_addAction:(KJButtonBlock)block{
    [self kj_addAction:block forControlEvents:UIControlEventTouchUpInside];
}
/// 添加事件
- (void)kj_addAction:(KJButtonBlock)block forControlEvents:(UIControlEvents)controlEvents{
    if (block == nil || controlEvents>(1<<8)) return;
    if (controlEvents != UIControlEventTouchDown && (controlEvents&1)) return;
    NSString *actionName = [@"kj_action" stringByAppendingFormat:@"%@",KJButtonControlEventsStringMap[controlEvents]];
    SEL selector = NSSelectorFromString(actionName);
    objc_setAssociatedObject(self, selector, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:selector forControlEvents:controlEvents];
}


分别说说三种return的情况


block :回调未处理

controlEvents>(1<<8) :超出九种情况

controlEvents&1 :多枚举情况


4. 获取每种UIControlEvents对应的绑定方法


NSString *actionName = [@"kj_action" stringByAppendingFormat:@"%@",KJButtonControlEventsStringMap[controlEvents]];
SEL selector = NSSelectorFromString(actionName);


5. 回调和绑定方法


objc_setAssociatedObject(self, selector, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self addTarget:self action:selector forControlEvents:controlEvents];


6. 获取回调处理


获取每种方法对应的回调

KJButtonBlock block = objc_getAssociatedObject(self, _cmd);
if (block) block(self);


友情提醒


暂时我只封装了上述的九种点击方式,其余的暂未处理

暂时不支持多枚举,例如如下方式是不支持的

[_button kj_addAction:^(UIButton * _Nonnull kButton) {
    NSLog(@"UIControlEventTouchDown");
} forControlEvents:(UIControlEventTouchDown)|(UIControlEventTouchUpInside)];


备注:本文用到的部分函数方法和Demo,均来自三方库KJEmitterView,如有需要的朋友可自行pod 'KJEmitterView'引入即可


UIButton点击快捷回调介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个小星星传送门

相关文章
|
3月前
|
iOS开发
iOS超出父控件范围无法点击问题
iOS超出父控件范围无法点击问题
143 58
|
3月前
|
iOS开发
iOS超出父控件范围无法点击问题
iOS超出父控件范围无法点击问题
|
4月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
vue--ios手机input点击手机输入键盘顶起页面解决方案
vue--ios手机input点击手机输入键盘顶起页面解决方案
|
iOS开发
iOS短信验证码控件,自动输入回调两次解决办法
iOS短信验证码控件,自动输入回调两次解决办法
484 0
|
前端开发 JavaScript Android开发
【前端】IOS微信浏览器点击右上角遮罩实现
现在有一个需求,通过公众号或者链接,下载app应用,大家都知道,安卓和ios下载对应的版本都不一样。并且,ios 微信浏览器不支持应用下载,需要实现一个遮罩功能,提示用户通过浏览器下载,效果如下:
217 0
【前端】IOS微信浏览器点击右上角遮罩实现
|
存储 自然语言处理 API
iOS 多语言快捷设置Xib设置
iOS 多语言快捷设置Xib设置
iOS 多语言快捷设置Xib设置
|
iOS开发 设计模式
|
11天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。