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

相关文章
|
5天前
|
iOS开发
iOS超出父控件范围无法点击问题
iOS超出父控件范围无法点击问题
|
1月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
vue--ios手机input点击手机输入键盘顶起页面解决方案
vue--ios手机input点击手机输入键盘顶起页面解决方案
|
iOS开发
iOS短信验证码控件,自动输入回调两次解决办法
iOS短信验证码控件,自动输入回调两次解决办法
416 0
|
前端开发 JavaScript Android开发
【前端】IOS微信浏览器点击右上角遮罩实现
现在有一个需求,通过公众号或者链接,下载app应用,大家都知道,安卓和ios下载对应的版本都不一样。并且,ios 微信浏览器不支持应用下载,需要实现一个遮罩功能,提示用户通过浏览器下载,效果如下:
198 0
【前端】IOS微信浏览器点击右上角遮罩实现
|
存储 自然语言处理 API
iOS 多语言快捷设置Xib设置
iOS 多语言快捷设置Xib设置
iOS 多语言快捷设置Xib设置
|
API iOS开发 Perl
iOS UIButton图文混排快捷显示
iOS UIButton图文混排快捷显示
iOS UIButton图文混排快捷显示
|
8天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
6天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
8天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
22 5