IOS setOnclick点击事件分析
程序员文章站
2023-12-18 10:00:10
在android中点击事件是以setonclick的形式进行设置的,用起来十分方便,而在ios中是以addtarget方式进行的,每次设置点击事件都需要声明一个新的方法,在...
在android中点击事件是以setonclick的形式进行设置的,用起来十分方便,而在ios中是以addtarget方式进行的,每次设置点击事件都需要声明一个新的方法,在大部分情况下显得未免有些麻烦。而且通常来说我们使用的最多的是touchupinside方式的点击事件,所以为了方便使用,我对uibutton/uiview的点击事件进行了扩展。
使用
和之前一样,我们先来看看扩展之后如何使用
oc版本
[_btn1 setonclick:^{ nslog(@"click btn1"); }];
swift版本
btn.setonclick { print("click btn") }
用起来真的是非常简单哈~
扩展过程
接下来我们就来看看,到底是如何扩展的呢?
oc版本
我们只需要为uibutton添加一个category就可以使用了哦。
#import <uikit/uikit.h> @interface uibutton(click) @property (nonatomic, strong) void (^clickblock) (void); - (void) setonclick : (void (^)(void))block; - (void) clickbtn : (uibutton*) sender; - (void) settarget : action:(sel)action; @end
#import "uibutton+click.h" #import <objc/runtime.h> @implementation uibutton(click) static void *clickkey = &clickkey; - (void)setclickblock:(void (^)(void))clickblock{ objc_setassociatedobject(self, & clickkey, clickblock, objc_association_copy); } - (void (^)(void))clickblock{ return objc_getassociatedobject(self, &clickkey); } -(void)setonclick:(void (^)(void))block{ self.clickblock = block; [self addtarget:self action:@selector(clickbtn:) forcontrolevents:uicontroleventtouchupinside]; } - (void) clickbtn : (uibutton*) sender{ self.clickblock(); } @end
如果我们不希望每次都需要导入uibutton+click.h,只需要将uibutton+click.h添加到pch文件中就可以了哦。
swift版本
相对来说swift版本就比较麻烦一点,竟然不能直接扩展闭包类型的属性,所以最后多创建了一个uiclick对象。
class uiclick : any{ var click : () -> void = {return} } extension uibutton : property{ var saveclick : uiclick{ get{ return get0() } set{ return set0(newvalue) } } func setonclick(click : @escaping () -> void) { self.saveclick = uiclick() self.saveclick.click = click self.addtarget(self, action: #selector(btnclick), for: .touchupinside) } @objc func btnclick(){ self.saveclick.click() } }
uiview onclick
看了以上的扩展过程,相信大家对uiview onclick的扩展心中也有数了,过程基本是一样的,接下来只简单写一下不同的部分。
func setonclickview(click : @escaping () -> void) { self.isuserinteractionenabled = true self.saveclickview = uiclick() self.saveclickview.click = click let tap = uitapgesturerecognizer(target: self, action: #selector(btnclickview)) tap.numberoftapsrequired = 1 self.addgesturerecognizer(tap) }
oc的就略过了,原理是一样的,代码也是非常简单。
总结
扩展并不复杂,但是确实还是带来了不少方便,希望这种扩展思路能够让你眼前一亮,以上内容有任何错误欢迎指正。