iOS防重點(diǎn)擊

1.iOS按鈕防重點(diǎn)擊

創(chuàng)建UIButton的分類着绷,需要注意的是恭理,load方法里殉挽,互換系統(tǒng)方法時(shí)的處理植影,直接執(zhí)行method_exchangeImplementations裳擎,點(diǎn)擊tabbar按鈕會(huì)crash,提示找不到對(duì)應(yīng)方法思币;

.h文件
@interface UIButton (FixMultiClick)

/**
點(diǎn)擊間隔:默認(rèn)0.5s鹿响,對(duì)所有按鈕生效:設(shè)置0s無(wú)效羡微,如果不需要放多點(diǎn)處理,需要設(shè)置cl_noFix=YES;
針對(duì)打電話惶我,可設(shè)置1s左右
*/
@property (nonatomic, assign) NSTimeInterval cl_acceptEventInterval;

/**
不做防多點(diǎn)的處理:如有些按鈕【點(diǎn)擊完】需要【立馬執(zhí)行】sendActionsForControlEvents:方法妈倔,此時(shí)如果操作了防多點(diǎn),則改方法會(huì)被阻斷绸贡;
解決方法是:設(shè)置cl_noFix=YES盯蝴;
并不是所有執(zhí)行sendActionsForControlEvents:方法的,都需要設(shè)置cl_noFix=YES恃轩;非立馬執(zhí)行的结洼,就不存在此問(wèn)題
默認(rèn)為NO
*/
@property (nonatomic, assign) BOOL cl_noFix;

@end

.m文件

import "UIButton+FixMultiClick.h"

import <objc/runtime.h>

define defaultInterval 0.5

static const char *UIButton_acceptEventInterval = "UIButton_acceptEventInterval";
static const char *UIButton_ignoreEvent = "UIButton_ignoreEvent";
static const char *UIButton_noFix = "UIButton_noFix";

@interface UIButton ()

/**
太短時(shí)間間隔內(nèi)(默認(rèn)是0.5s),忽略新的點(diǎn)擊事件:默認(rèn)為No
*/
@property (nonatomic, assign) BOOL cl_ignoreEvent;

@end

@implementation UIButton (FixMultiClick)

/**
顧名思義叉跛,load方法在這個(gè)文件被程序裝載時(shí)調(diào)用松忍。只要是在Compile Sources中出現(xiàn)的文件總是會(huì)被裝載,這與這個(gè)類是否被用到無(wú)關(guān)筷厘,因此load方法總是在main函數(shù)之前調(diào)用鸣峭。
*/

  • (void)load
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    //點(diǎn)擊事件
    SEL selA = @selector(sendAction:to:forEvent:);
    SEL selB = @selector(fixMultiClickSendAction: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));
    if (isAdd) {
    //添加成功酥艳,說(shuō)明本類中不存在methodB摊溶,所以此時(shí)必須將methodB的實(shí)現(xiàn)指針換成methodA的,否則methodB將沒(méi)有實(shí)現(xiàn)
    class_replaceMethod(self, selB, method_getImplementation(methodA), method_getTypeEncoding(methodA));
    } else {
    //添加失敗充石,說(shuō)明本類中methodB的實(shí)現(xiàn)莫换,只需將methodA和methodB的IMP互換即可
    method_exchangeImplementations(methodA, methodB);
    }
    });
    }
  • (void)fixMultiClickSendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
    {
    if (self.cl_noFix) {
    //不做防多點(diǎn)的處理,如有些按鈕需要執(zhí)行sendActionsForControlEvents:方法
    [self fixMultiClickSendAction:action to:target forEvent:event];
    return;
    }
    if (self.cl_ignoreEvent) {
    return;
    }
    //將cl_ignoreEvent的設(shè)置提前骤铃,防止在這期間來(lái)了新的點(diǎn)擊事件拉岁,從而沒(méi)有達(dá)到阻斷的目的
    self.cl_ignoreEvent = YES;
    if ([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {
    //cl_acceptEventInterval為0時(shí),設(shè)置為默認(rèn)0.5s
    if (!self.cl_acceptEventInterval) {
    self.cl_acceptEventInterval = defaultInterval;
    }
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.cl_acceptEventInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    //指定間隔后惰爬,放開阻斷
    self.cl_ignoreEvent = NO;
    });
    } else {
    //非UIButton(如UITabButton)喊暖,不做此處理
    self.cl_ignoreEvent = NO;
    }
    [self fixMultiClickSendAction:action to:target forEvent:event];
    }

pragma mark - getter/setter

  • (NSTimeInterval)cl_acceptEventInterval
    {
    return [objc_getAssociatedObject(self, UIButton_acceptEventInterval) doubleValue];
    }

  • (void)setCl_acceptEventInterval:(NSTimeInterval)cl_acceptEventInterval
    {
    objc_setAssociatedObject(self, UIButton_acceptEventInterval, @(cl_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

  • (BOOL)cl_ignoreEvent
    {
    return [objc_getAssociatedObject(self, UIButton_ignoreEvent) boolValue];
    }

  • (void)setCl_ignoreEvent:(BOOL)cl_ignoreEvent
    {
    objc_setAssociatedObject(self, UIButton_ignoreEvent, @(cl_ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

  • (BOOL)cl_noFix
    {
    return [objc_getAssociatedObject(self, UIButton_noFix) boolValue];
    }

  • (void)setCl_noFix:(BOOL)cl_noFix
    {
    objc_setAssociatedObject(self, UIButton_noFix, @(cl_noFix), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

@end

2.對(duì)cell添加防重處理

首先,貼方法

  • (BOOL)fastSelectedCell
    {
    if (self.ignoreEvent) {
    return YES;
    }
    self.ignoreEvent = YES;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.acceptEventInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.ignoreEvent = NO;
    });
    return NO;
    }
    在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath方法中撕瞧,判斷是否快速點(diǎn)擊陵叽,再執(zhí)行操作。
?著作權(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

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