UIButton點(diǎn)擊間隔設(shè)置

場景

當(dāng)app有點(diǎn)卡的時(shí)候闰蛔,多次點(diǎn)擊相同的button悟泵,經(jīng)常出現(xiàn),跳轉(zhuǎn)了N次相同的界面

解決辦法

用運(yùn)行時(shí)和分類,替換UIControl響應(yīng)事件干旁,根據(jù)響應(yīng)的間隔時(shí)間來判斷是否執(zhí)行事件驶沼。

另一種解決方案就是button點(diǎn)擊事件執(zhí)行時(shí)設(shè)置button的用戶交互屬性,再次只討論設(shè)置兩次點(diǎn)擊間隔的問題争群。

詳細(xì)步驟

創(chuàng)建一個(gè)UIControl的分類

![1278915-5087176d34bb4814.png](http://upload-images.jianshu.io/upload_images/2816873-4fde65e377667796.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

為了方便他人調(diào)整不同的間隔時(shí)間需求,在UIControl+Custom.h文件中開放間隔時(shí)間屬性大年,UIControl+Custom.h文件的代碼為:

<pre><code>

import <UIKit/UIKit.h>

@interface UIControl (Custom)

@property (nonatomic, assign) NSTimeInterval custom_acceptEventInterval;// 可以用這個(gè)給重復(fù)點(diǎn)擊加間隔

@end
</pre></code>

UIControl+Custom.m文件中實(shí)現(xiàn)方法交換(妥善的做法是:先添加方法换薄,如果方法已經(jīng)存在,就替換原方法)翔试,在UIControl+Custom.m文件的代碼為:

<pre><code>

import "UIControl+custom.h"

import <objc/runtime.h>

@interface UIControl()

@property (nonatomic, assign) NSTimeInterval custom_acceptEventTime;

@end

@implementation UIControl (Custom)

+ (void)load{

Method systemMethod = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
SEL sysSEL = @selector(sendAction:to:forEvent:);

  Method customMethod = class_getInstanceMethod(self, @selector(custom_sendAction:to:forEvent:));
  SEL customSEL = @selector(custom_sendAction:to:forEvent:);

  //添加方法 語法:BOOL class_addMethod(Class cls, SEL name, IM P imp, const char *types) 若添加成功則返回No
  // cls:被添加方法的類  name:被添加方法方法名  imp:被添加方法的實(shí)現(xiàn)函數(shù)  types:被添加方法的實(shí)現(xiàn)函數(shù)的返回值類型和參數(shù)類型的字符串
BOOL didAddMethod = class_addMethod(self, sysSEL, method_getImplementation(customMethod), method_getTypeEncoding(customMethod));

  //如果系統(tǒng)中該方法已經(jīng)存在了轻要,則替換系統(tǒng)的方法  語法:IMP class_replaceMethod(Class cls, SEL name, IMP imp,const char *types)
  if (didAddMethod) {
    class_replaceMethod(self, customSEL, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
  }else{
    method_exchangeImplementations(systemMethod, customMethod);
    
  }
  }

- (NSTimeInterval )custom_acceptEventInterval{
    return [objc_getAssociatedObject(self, "UIControl_acceptEventInterval") doubleValue];
  }
    
- (void)setCustom_acceptEventInterval:(NSTimeInterval)custom_acceptEventInterval{
    objc_setAssociatedObject(self, "UIControl_acceptEventInterval", @(custom_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  }
        
- (NSTimeInterval )custom_acceptEventTime{
    return [objc_getAssociatedObject(self, "UIControl_acceptEventTime") doubleValue];

}

- (void)setCustom_acceptEventTime:(NSTimeInterval)custom_acceptEventTime{
    objc_setAssociatedObject(self, "UIControl_acceptEventTime", @(custom_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  }
                
- (void)custom_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
                    
      // 如果想要設(shè)置統(tǒng)一的間隔時(shí)間,可以在此處加上以下幾句
      // 值得提醒一下:如果這里設(shè)置了統(tǒng)一的時(shí)間間隔垦缅,會影響UISwitch,如果想統(tǒng)一設(shè)置冲泥,又不想影響UISwitch,建議將UIControl分類壁涎,改成UIButton分類凡恍,實(shí)現(xiàn)方法是一樣的
      // if (self.custom_acceptEventInterval <= 0) {
      //     // 如果沒有自定義時(shí)間間隔,則默認(rèn)為2秒
      //    self.custom_acceptEventInterval = 2;
      // }
                    
    // 是否小于設(shè)定的時(shí)間間隔
     BOOL needSendAction = (NSDate.date.timeIntervalSince1970 - self.custom_acceptEventTime >= self.custom_acceptEventInterval);
                    
       // 更新上一次點(diǎn)擊時(shí)間戳
          if (self.custom_acceptEventInterval > 0) {
              self.custom_acceptEventTime = NSDate.date.timeIntervalSince1970;
           }
                    
       // 兩次點(diǎn)擊的時(shí)間間隔小于設(shè)定的時(shí)間間隔時(shí)怔球,才執(zhí)行響應(yīng)事件
           if (needSendAction) {
               [self custom_sendAction:action to:target forEvent:event];
           }

}

@end
</pre></code>

簡書的一次試水嚼酝,文章參考自簡書ocarol

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竟坛,隨后出現(xiàn)的幾起案子闽巩,更是在濱河造成了極大的恐慌,老刑警劉巖担汤,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涎跨,死亡現(xiàn)場離奇詭異,居然都是意外死亡崭歧,警方通過查閱死者的電腦和手機(jī)隅很,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驾荣,“玉大人外构,你說我怎么就攤上這事〔ブ溃” “怎么了审编?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歧匈。 經(jīng)常有香客問我垒酬,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任勘究,我火速辦了婚禮矮湘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘口糕。我一直安慰自己缅阳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布景描。 她就那樣靜靜地躺著十办,像睡著了一般。 火紅的嫁衣襯著肌膚如雪超棺。 梳的紋絲不亂的頭發(fā)上向族,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音棠绘,去河邊找鬼件相。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氧苍,可吹牛的內(nèi)容都是我干的夜矗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼候引,長吁一口氣:“原來是場噩夢啊……” “哼侯养!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澄干,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逛揩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后麸俘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辩稽,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年从媚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逞泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拜效,死狀恐怖喷众,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情紧憾,我是刑警寧澤到千,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赴穗,受9級特大地震影響憔四,放射性物質(zhì)發(fā)生泄漏膀息。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一了赵、第九天 我趴在偏房一處隱蔽的房頂上張望潜支。 院中可真熱鬧,春花似錦柿汛、人聲如沸冗酿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已烤。三九已至,卻和暖如春妓羊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稍计。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工躁绸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臣嚣。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓净刮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硅则。 傳聞我的和親對象是個(gè)殘疾皇子淹父,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了怎虫?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求暑认?亦或是...
    Lotheve閱讀 57,092評論 51 599
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件。本想自己總結(jié)一下大审,但是遇到了這篇文章蘸际,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載徒扶。作者:L...
    WQ_UESTC閱讀 6,010評論 4 26
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評論 30 470
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理粮彤,服務(wù)發(fā)現(xiàn),斷路器姜骡,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,970評論 6 13