UIControl類防止重復(fù)暴力點(diǎn)擊方法匯總

一、按鈕點(diǎn)擊后先取消之前的操作

- (void)buttonClicked:(id)sender{
//點(diǎn)擊按鈕后先取消之前的操作肆饶,再進(jìn)行需要進(jìn)行的操作
[[self class]cancelPreviousPerformRequestsWithTarget:selfselector:@selector(buttonClicked:) object:sender];
}

二秃嗜、按鈕點(diǎn)擊后設(shè)為不可點(diǎn)擊狀態(tài),幾秒后恢復(fù)

-(void)buttonClicked:(id)sender{
self.button.enabled = NO;
[self performSelector:@selector(changeButtonStatus) withObject:nil afterDelay:1.0f];//防止重復(fù)點(diǎn)擊
}
-(void)changeButtonStatus{
self.button.enabled =YES;
}

三澎羞、使用runtime

#import <UIKit/UIKit.h>
@interface UIControl (repeatedClick)
/**
 可以重復(fù)點(diǎn)擊的時(shí)間間隔
 默認(rèn)為0 不對(duì)按鈕重復(fù)點(diǎn)擊處理
 */
@property (nonatomic,assign) NSTimeInterval timeInterval;//用這個(gè)給重復(fù)點(diǎn)擊加間隔
/**
 內(nèi)部屬性用于判斷是否忽略替換的點(diǎn)擊事件
 */
@property (nonatomic,assign) BOOL isIgnoreEvent;
@end
#import "UIControl+repeatedClick.h"
#import <objc/runtime.h>
#define defaultInterval 0.25    //默認(rèn)時(shí)間間隔  

@implementation UIControl (repeatedClick)
- (NSTimeInterval)timeInterval{
    return [objc_getAssociatedObject(self,_cmd)doubleValue];
}

- (void)setTimeInterval:(NSTimeInterval)timeInterval{
   objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{
    objc_setAssociatedObject(self,@selector(isIgnoreEvent),@(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)isIgnoreEvent{
    return [objc_getAssociatedObject(self,_cmd)boolValue];
}

- (void)resetState{
    [self setIsIgnoreEvent:NO];
}

+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SEL selA = @selector(sendAction:to:forEvent:);
        SEL selB = @selector(mySendAction:to:forEvent:);
        Method methodA = class_getInstanceMethod(self, selA);
        Method methodB = class_getInstanceMethod(self, selB);
        //將methodB的實(shí)現(xiàn)添加到系統(tǒng)方法中也就是說(shuō)將methodA方法指針添加成方法methodB的返回值表示是否添加成功
        BOOL isAdd = class_addMethod(self, selA,method_getImplementation(methodB),method_getTypeEncoding(methodB));
        //添加成功了說(shuō)明本類中不存在methodB所以此時(shí)必須將方法b的實(shí)現(xiàn)指針換成方法A的髓绽,否則b方法將沒(méi)有實(shí)現(xiàn)。
        if(isAdd) {
            class_replaceMethod(self, selB,method_getImplementation(methodA),method_getTypeEncoding(methodA));
        }else{
            //添加失敗了說(shuō)明本類中有methodB的實(shí)現(xiàn)妆绞,此時(shí)只需要將methodA和methodB的IMP互換一下即可顺呕。
            method_exchangeImplementations(methodA, methodB);
        }
    });
}

- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event{
    if([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {
        self.timeInterval = self.timeInterval == 0 ? defaultInterval:self.timeInterval;
        if(self.isIgnoreEvent){
            return;
        }else if(self.timeInterval > 0){
            [self performSelector:@selector(resetState)withObject:nil afterDelay:self.timeInterval];
        }
    }
    //此處methodA和methodB方法IMP互換了,實(shí)際上執(zhí)行sendAction括饶;所以不會(huì)死循環(huán)
    self.isIgnoreEvent = YES;
    [self mySendAction:action to:target forEvent:event];
}
@end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末株茶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子图焰,更是在濱河造成了極大的恐慌启盛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技羔,死亡現(xiàn)場(chǎng)離奇詭異僵闯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)藤滥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)鳖粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人超陆,你說(shuō)我怎么就攤上這事牺弹∑致恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵张漂,是天一觀的道長(zhǎng)晶默。 經(jīng)常有香客問(wèn)我,道長(zhǎng)航攒,這世上最難降的妖魔是什么磺陡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮漠畜,結(jié)果婚禮上币他,老公的妹妹穿的比我還像新娘。我一直安慰自己憔狞,他們只是感情好蝴悉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘾敢,像睡著了一般拍冠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簇抵,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天庆杜,我揣著相機(jī)與錄音,去河邊找鬼碟摆。 笑死晃财,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的典蜕。 我是一名探鬼主播断盛,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘉裤!你這毒婦竟也來(lái)了郑临?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屑宠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仇让,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體典奉,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年丧叽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卫玖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踊淳,死狀恐怖假瞬,靈堂內(nèi)的尸體忽然破棺而出陕靠,到底是詐尸還是另有隱情,我是刑警寧澤脱茉,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布剪芥,位于F島的核電站,受9級(jí)特大地震影響琴许,放射性物質(zhì)發(fā)生泄漏税肪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一榜田、第九天 我趴在偏房一處隱蔽的房頂上張望益兄。 院中可真熱鬧,春花似錦箭券、人聲如沸净捅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛔六。三九已至,卻和暖如春庆捺,著一層夾襖步出監(jiān)牢的瞬間古今,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工滔以, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捉腥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓你画,卻偏偏與公主長(zhǎng)得像抵碟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坏匪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容