ios UIButton点击快捷回调

2020-12-01  本文已影响0人  弹吉他的少年

前言

. 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的情况
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,均来自三方库KJCategories,如有需要的朋友可自行pod 'KJCategories'引入即可

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

上一篇下一篇

猜你喜欢

热点阅读