IOS setOnclick點(diǎn)擊事件分析
在Android中點(diǎn)擊事件是以setOnclick的形式進(jìn)行設(shè)置的,用起來(lái)十分方便,而在ios中是以addTarget方式進(jìn)行的,每次設(shè)置點(diǎn)擊事件都需要聲明一個(gè)新的方法,在大部分情況下顯得未免有些麻煩。而且通常來(lái)說(shuō)我們使用的最多的是TouchUpInside方式的點(diǎn)擊事件,所以為了方便使用,我對(duì)UIButton/UIView的點(diǎn)擊事件進(jìn)行了擴(kuò)展。
使用
和之前一樣,我們先來(lái)看看擴(kuò)展之后如何使用
oc版本
[_btn1 setOnclick:^{ NSLog(@"click btn1"); }];
swift版本
btn.setOnClick { print("click btn") }
用起來(lái)真的是非常簡(jiǎn)單哈~
擴(kuò)展過(guò)程
接下來(lái)我們就來(lái)看看,到底是如何擴(kuò)展的呢?
oc版本
我們只需要為UIButton添加一個(gè)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
如果我們不希望每次都需要導(dǎo)入U(xiǎn)IButton+click.h,只需要將UIButton+click.h添加到pch文件中就可以了哦。
swift版本
相對(duì)來(lái)說(shuō)swift版本就比較麻煩一點(diǎn),竟然不能直接擴(kuò)展閉包類型的屬性,所以最后多創(chuàng)建了一個(gè)UIClick對(duì)象。
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
看了以上的擴(kuò)展過(guò)程,相信大家對(duì)UIView onClick的擴(kuò)展心中也有數(shù)了,過(guò)程基本是一樣的,接下來(lái)只簡(jiǎn)單寫一下不同的部分。
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的就略過(guò)了,原理是一樣的,代碼也是非常簡(jiǎn)單。
總結(jié)
擴(kuò)展并不復(fù)雜,但是確實(shí)還是帶來(lái)了不少方便,希望這種擴(kuò)展思路能夠讓你眼前一亮,以上內(nèi)容有任何錯(cuò)誤歡迎指正。
- iOS開(kāi)發(fā)中TabBar再次點(diǎn)擊實(shí)現(xiàn)刷新效果
- iOS實(shí)現(xiàn)點(diǎn)擊圖片放大和長(zhǎng)按保存圖片的示例
- iOS開(kāi)發(fā)商品頁(yè)中banner中點(diǎn)擊查看圖片
- ios App加載本地HTML網(wǎng)頁(yè),點(diǎn)擊網(wǎng)頁(yè)鏈接跳轉(zhuǎn)到app頁(yè)面的方法
- iOS下Safari點(diǎn)擊事件失效的解決方法
- iOS UIButton 點(diǎn)擊無(wú)響應(yīng)的解決辦法
- 解決ios端點(diǎn)擊按鈕閃爍問(wèn)題(小tips)
- IOS 中UIImageView響應(yīng)點(diǎn)擊事件
相關(guān)文章
iOS獲取短信驗(yàn)證碼倒計(jì)時(shí)的兩種實(shí)現(xiàn)方法
本篇文章主要介紹了iOS獲取短信驗(yàn)證碼倒計(jì)時(shí)的兩種實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05IOS 手勢(shì)操作詳解及實(shí)例總結(jié)篇
這篇文章主要介紹了IOS 手勢(shì)操作詳解及實(shí)例總結(jié)篇的相關(guān)資料,需要的朋友可以參考下2017-01-01iOS使用視聽(tīng)媒體框架AVFoundation實(shí)現(xiàn)照片拍攝
這篇文章主要為大家詳細(xì)介紹了iOS使用視聽(tīng)媒體框架AVFoundation實(shí)現(xiàn)照片拍攝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法
這篇文章主要介紹了IOS 禁止縮放頁(yè)面的實(shí)現(xiàn)方法的相關(guān)資料,這里主要介紹了IOS 10如何通過(guò)設(shè)置來(lái)實(shí)現(xiàn)禁止縮放及實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07IOS UI學(xué)習(xí)教程之區(qū)分NSBundle和NSURL(讀取文件、寫入文件)
這篇文章主要為大家詳細(xì)介紹了IOS UI學(xué)習(xí)教程之區(qū)分NSBundle和NSURL,如何讀取、寫入文件,感興趣的小伙伴們可以參考一下2016-03-03iOS NSNotificationCenter通知中心使用小結(jié)
IOS中經(jīng)常會(huì)使用到NSNotification和delegate來(lái)進(jìn)行一些類之間的消息傳遞,這篇文章主要介紹了iOS NSNotificationCenter使用小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Android開(kāi)發(fā)筆記之簡(jiǎn)單基站定位程序的實(shí)現(xiàn)
這篇文章主要介紹了Android開(kāi)發(fā)筆記之簡(jiǎn)單基站定位程序的實(shí)現(xiàn),詳細(xì)的介紹了基站定位其實(shí)很簡(jiǎn)單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11iOS中關(guān)于Cookie驗(yàn)證登錄狀態(tài)
這篇文章主要介紹了iOS中關(guān)于Cookie驗(yàn)證登錄狀態(tài)的相關(guān)資料,需要的朋友可以參考下2017-05-05