iOS UIButton 防止連續(xù)點(diǎn)擊(最后一次才去響應(yīng)事件)

方案一

- (void)buttonClickMethod:(UIButton *)sender {
    
    // 每次點(diǎn)擊的時(shí)候都會(huì)先取消一次響應(yīng),然后調(diào)用perform方法叙量,延遲響應(yīng)該事件,避免多次響應(yīng)
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayResponseMethod) object:btn];
    // 延遲執(zhí)行夕晓,一般設(shè)置1秒左右宛乃,太久會(huì)顯得有延遲,響應(yīng)也不能太慢
    [self performSelector:@selector(delayResponseMethod) withObject:btn afterDelay:1.0];
}
- (void)delayResponseMethod {
    NSLog(@"延遲執(zhí)行的方法");
}

方案二

  • 通過(guò)NSTimer延遲執(zhí)行方法蒸辆,和方案一類似
//定時(shí)器
@property (nonatomic, strong) NSTimer *timer;//定時(shí)器
@property(nonatomic, assign) NSInteger count;
//需要給count一個(gè)默認(rèn)值征炼,比如0
- (void)buttonClickMethod:(UIButton *)sender {
    self.count ++;
    [self.timer invalidate];
    self.timer = nil;
    self.timer =[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(delayResponseMethod) userInfo:nil repeats:NO];
/* NSRunLoopCommonModes 防止?jié)L動(dòng)的時(shí)候有延遲*/
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void)delayResponseMethod {
    NSLog(@"延遲執(zhí)行的方法");
}

方案三

通過(guò)Runtime交換UIButton的響應(yīng)事件方法,從而控制響應(yīng)事件的時(shí)間間隔躬贡。

1 創(chuàng)建一個(gè)UIButton的分類拂玻,使用runtime增加public屬性cs_eventInterval和private屬性cs_eventInvalid酸些。
2 在+load方法中使用runtime將UIButton的-sendAction:to:forEvent:方法與自定義的cs_sendAction:to:forEvent:方法進(jìn)行交換
3 使用cs_eventInterval作為控制cs_eventInvalid的計(jì)時(shí)因子,用cs_eventInvalid控制UIButton的event事件是否有效檐蚜。
*代碼實(shí)現(xiàn)如下

@interface UIButton (Extension)

/** 時(shí)間間隔 */
@property(nonatomic, assign)NSTimeInterval cs_eventInterval;

@end

import "UIButton+Extension.h"

import <objc/runtime.h>

static char *const kEventIntervalKey = "kEventIntervalKey"; // 時(shí)間間隔
static char *const kEventInvalidKey = "kEventInvalidKey"; // 是否失效

@interface UIButton()

/** 是否失效 - 即不可以點(diǎn)擊 */
@property(nonatomic, assign)BOOL cs_eventInvalid;

@end

@implementation UIButton (Extension)

  • (void)load {
    // 交換方法
    Method clickMethod = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    Method cs_clickMethod = class_getInstanceMethod(self, @selector(cs_sendAction:to:forEvent:));
    method_exchangeImplementations(clickMethod, cs_clickMethod);
    }

pragma mark - click

  • (void)cs_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    if (!self.cs_eventInvalid) {
    self.cs_eventInvalid = YES;
    [self cs_sendAction:action to:target forEvent:event];
    [self performSelector:@selector(setCs_eventInvalid:) withObject:@(NO) afterDelay:self.cs_eventInterval];
    }
    }

pragma mark - set | get

  • (NSTimeInterval)cs_eventInterval {
    return [objc_getAssociatedObject(self, kEventIntervalKey) doubleValue];
    }

  • (void)setCs_eventInterval:(NSTimeInterval)cs_eventInterval {
    objc_setAssociatedObject(self, kEventIntervalKey, @(cs_eventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

  • (BOOL)cs_eventInvalid {
    return [objc_getAssociatedObject(self, kEventInvalidKey) boolValue];
    }

  • (void)setCs_eventInvalid:(BOOL)cs_eventInvalid {
    objc_setAssociatedObject(self, kEventInvalidKey, @(cs_eventInvalid), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    測(cè)試代碼如下
    /** 方法三 */

  • (void)drawExpecialBtn{
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
    [btn setTitle:@"按鈕點(diǎn)擊" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    // 按鈕不可點(diǎn)擊時(shí),文字顏色置灰
    [btn setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
    [btn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
    btn.center = self.view.center;
    [btn addTarget:self action:@selector(tapBtn:) forControlEvents:UIControlEventTouchUpInside];
    btn.cs_eventInterval = 2.0;
    [self.view addSubview:btn];
    }

  • (void)tapBtn:(UIButton *)btn {
    NSLog(@"按鈕點(diǎn)擊...");
    }

  • 在方法三中交互UIButton的sendAction:to:forEvent:方法,實(shí)際上交互的是UIControl的sendAction:to:forEvent:方法魄懂,所以在使用·UIControl·或其·子類(比如UISlider)·的·sendAction:to:forEvent:·方法時(shí)會(huì)引起參數(shù)缺失的崩潰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闯第,一起剝皮案震驚了整個(gè)濱河市市栗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咳短,老刑警劉巖填帽,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咙好,居然都是意外死亡篡腌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門勾效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘹悼,“玉大人,你說(shuō)我怎么就攤上這事层宫』媲ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵卒密,是天一觀的道長(zhǎng)缀台。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哮奇,這世上最難降的妖魔是什么膛腐? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任睛约,我火速辦了婚禮,結(jié)果婚禮上哲身,老公的妹妹穿的比我還像新娘辩涝。我一直安慰自己,他們只是感情好勘天,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布怔揩。 她就那樣靜靜地躺著,像睡著了一般脯丝。 火紅的嫁衣襯著肌膚如雪商膊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天宠进,我揣著相機(jī)與錄音晕拆,去河邊找鬼。 笑死材蹬,一個(gè)胖子當(dāng)著我的面吹牛实幕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堤器,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昆庇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了闸溃?” 一聲冷哼從身側(cè)響起整吆,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圈暗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裕膀,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡员串,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昼扛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寸齐。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抄谐,靈堂內(nèi)的尸體忽然破棺而出渺鹦,到底是詐尸還是另有隱情,我是刑警寧澤蛹含,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布毅厚,位于F島的核電站,受9級(jí)特大地震影響浦箱,放射性物質(zhì)發(fā)生泄漏吸耿。R本人自食惡果不足惜祠锣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咽安。 院中可真熱鬧伴网,春花似錦、人聲如沸妆棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春诀蓉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背究飞。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工埃疫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纠脾。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓玛瘸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苟蹈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糊渊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355