一個小問題

今天在公司項目中遇到一個問題,一個網絡請求的按鈕,點擊以后我沒有禁用,用戶一直點擊,APP頻繁的請求同一個接口,而且無限彈窗。

解決歷程

1.寫一個按鈕的分類或者子類,在- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

這個方法重寫點擊事件,做一個時間的延時判斷,缺點,你需要在所有的按鈕創(chuàng)建的地方用這個類去替換原來的UIButton,項目改動太大.

2.還有一種方法,就是利用運行時,通過iOS黑魔法-Method Swizzling寫按鈕的祖宗(UIControl)的分類,通過方法交換,實現(xiàn)限制按鈕被重復點擊.下面是實現(xiàn)過程

在.h中聲明一個屬性,用來設置按鈕延時的時間:

@property(nonatomic,assign)NSTimeIntervalclickDurationTime;

在.m文件中代碼如下

#import"UIControl+extension.h"

static const NSTimeIntervaldefaultDuration =1.0f;// 記錄是否忽略按鈕點擊事件踩娘,

默認第一次執(zhí)行事件

static BOOL _isIgnoreEvent = NO;

staticvoidresetState()

{_isIgnoreEvent=NO;}

@implementationUIControl(extension)

@dynamicclickDurationTime;

+ (void)load

{

SEL originSEL = @selector(sendAction:to:forEvent:);

SEL newSEL = @selector(new_sendAction:to:forEvent:);

Method originM = class_getInstanceMethod([selfclass], originSEL);

constchar *typeEncodinds = method_getTypeEncoding(originM);

Method newM = class_getInstanceMethod([selfclass], newSEL);

IMP newIMP = method_getImplementation(newM);

if(class_addMethod([selfclass], newSEL, newIMP, typeEncodinds))

{

class_replaceMethod([selfclass], originSEL, newIMP, typeEncodinds);

}

else

{

method_exchangeImplementations(originM, newM);

}

}

- (void)my_sendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event {

UITabBarButtonNSLog(@"%@",NSStringFromClass([selfclass]));// 保險起見戚哎,判斷下Class類型

if([selfisKindOfClass:[UIButtonclass]])

{//1. 按鈕點擊間隔事件self.clickDurationTime =self.clickDurationTime ==0? defaultDuration :self.clickDurationTime;//2. 是否忽略按鈕點擊事件if(_isIgnoreEvent)

{

//2.1 忽略按鈕事件

return;

}

else if (self.clickDurationTime >0)

{

//2.2 不忽略按鈕事件

// 后續(xù)在間隔時間內直接忽略按鈕事件

_isIgnoreEvent =YES;// 間隔事件后硼端,執(zhí)行按鈕事件dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.clickDurationTime *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{? ? ? ? ? ? resetState();? ? ? ? });

// 發(fā)送按鈕點擊消息

[selfmy_sendAction:action to:target forEvent:event];

}}

else

{

[selfmy_sendAction:action to:target forEvent:event];

}

}

#pragma mark - associate- (void)setClickDurationTime:(NSTimeInterval)clickDurationTime {objc_setAssociatedObject(self,@selector(clickDurationTime), @(clickDurationTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSTimeInterval)clickDurationTime {

return [objc_getAssociatedObject(self,@selector(clickDurationTime)) doubleValue];

}

@end

這個demo里面的所有按鈕都做了防止連續(xù)點擊事件,你的項目如果想集成這個功能,只需要把demo中的UIControl+Extension的分類放到你的項目中,并在需要用的地方導入頭文件,也可以直接放在PCH文件中就OK了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末梯浪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灼捂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件换团,死亡現(xiàn)場離奇詭異悉稠,居然都是意外死亡,警方通過查閱死者的電腦和手機艘包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門的猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人想虎,你說我怎么就攤上這事卦尊。” “怎么了舌厨?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵岂却,是天一觀的道長。 經常有香客問我裙椭,道長躏哩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任揉燃,我火速辦了婚禮扫尺,結果婚禮上,老公的妹妹穿的比我還像新娘你雌。我一直安慰自己器联,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布婿崭。 她就那樣靜靜地躺著,像睡著了一般肴颊。 火紅的嫁衣襯著肌膚如雪氓栈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天婿着,我揣著相機與錄音授瘦,去河邊找鬼。 笑死竟宋,一個胖子當著我的面吹牛提完,可吹牛的內容都是我干的。 我是一名探鬼主播丘侠,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼徒欣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜗字?” 一聲冷哼從身側響起打肝,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤脂新,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粗梭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體争便,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年断医,在試婚紗的時候發(fā)現(xiàn)自己被綠了滞乙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡鉴嗤,死狀恐怖斩启,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情躬窜,我是刑警寧澤浇垦,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站荣挨,受9級特大地震影響男韧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜默垄,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一此虑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧口锭,春花似錦朦前、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荆隘,卻和暖如春恩伺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椰拒。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工晶渠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燃观。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓褒脯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缆毁。 傳聞我的和親對象是個殘疾皇子番川,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,692評論 0 9
  • runtime 和 runloop 作為一個程序員進階是必須的,也是非常重要的爽彤, 在面試過程中是經常會被問到的养盗, ...
    made_China閱讀 1,207評論 0 7
  • runtime 和 runloop 作為一個程序員進階是必須的,也是非常重要的适篙, 在面試過程中是經常會被問到的往核, ...
    SOI閱讀 21,796評論 3 63
  • 在之前的開發(fā)中用到了UIMenuController這個類,發(fā)現(xiàn)一個小問題嚷节,記錄下來聂儒,具體如下 UIMenuCon...
    鐫寫不一樣的人生閱讀 1,336評論 0 0
  • Swift2.0 1.defer譯為延緩、推遲之意類似棧 注意作用域硫痰,其次是調用順序——即一個作用域結束(注意)衩婚,...
    zeqinjie閱讀 3,373評論 0 50