iOS小技巧:用runtime 解決UIButton 重復(fù)點(diǎn)擊問題

參考鏈接:

http://www.cocoachina.com/ios/20150911/13260.html

問題描述:

? ? ? 我們的按鈕是點(diǎn)擊一次響應(yīng)一次, 即使頻繁的點(diǎn)擊也不會出問題, 可是某些場景下還偏偏就是會出問題.

通常是如何解決

我們通常會在按鈕點(diǎn)擊的時候設(shè)置這個按鈕不可點(diǎn)擊. 等待0.xS的延時后,在設(shè)置回來; 或者在操作結(jié)束的時候設(shè)置可以點(diǎn)擊.


- (IBAction)clickBtn1:(UIbutton *)sender

{

sender.enabled = NO;

doSomething

sender.enabled = YES;

}


如果涉及到按鈕不同狀態(tài)不同樣式的時候, 用enabled不見得夠用.還得額外加個變量來記錄狀態(tài).


- (IBAction)clickBtn1:(UIbutton *)sender

{

if (doingSomeThing) return;

doingSomeThing = YES;

doSomething

doingSomeThing = NO;

}


上面的例子是直接在響應(yīng)事件的周期內(nèi)直接禁止點(diǎn)擊的. 如果想做1秒內(nèi)禁止重復(fù)點(diǎn)擊的話,則得用performSelector:withObject:afterDelay:


漂亮的解決是怎樣的

有了重復(fù)的代碼段就是有了一個共性, 就可以抽象出來.

我們可以給按鈕添加一個屬性重復(fù)點(diǎn)擊間隔, 通過設(shè)置這個屬性來控制再次接受點(diǎn)擊事件的時間間隔.


@interface UIControl (XY)

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

@end

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";

- (NSTimeInterval)uxy_acceptEventInterval

{

return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

}

- (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval

{

objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}


在app啟動的時候,我們hook 所有的按鈕的 event


@implementation UIControl (XY)

+ (void)load

{

Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));

Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));

method_exchangeImplementations(a, b);

}

@end


在我們的點(diǎn)擊事件里呢,對點(diǎn)擊事件做下過濾


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

{

if (self.uxy_ignoreEvent) return;

if (self.uxy_acceptEventInterval > 0)

{

self.uxy_ignoreEvent = YES;

[self performSelector:@selector(setUxy_ignoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];

}


實(shí)際使用起來就是這個樣子


UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];

[tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];

tempBtn.uxy_acceptEventInterval = 0.5;


雖然不推薦大范圍用runtime, 但是小范圍內(nèi)使用還是可以解決不少小問題的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子塘辅,更是在濱河造成了極大的恐慌理朋,老刑警劉巖惠桃,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶乾,死亡現(xiàn)場離奇詭異,居然都是意外死亡金刁,警方通過查閱死者的電腦和手機(jī)迷捧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀葱,“玉大人漠秋,你說我怎么就攤上這事〉钟欤” “怎么了庆锦?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轧葛。 經(jīng)常有香客問我搂抒,道長,這世上最難降的妖魔是什么尿扯? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任求晶,我火速辦了婚禮,結(jié)果婚禮上衷笋,老公的妹妹穿的比我還像新娘芳杏。我一直安慰自己,他們只是感情好辟宗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布爵赵。 她就那樣靜靜地躺著,像睡著了一般泊脐。 火紅的嫁衣襯著肌膚如雪空幻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天容客,我揣著相機(jī)與錄音秕铛,去河邊找鬼。 笑死缩挑,一個胖子當(dāng)著我的面吹牛但两,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播调煎,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼镜遣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悲关,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤谎僻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寓辱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艘绍,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年秫筏,在試婚紗的時候發(fā)現(xiàn)自己被綠了诱鞠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡这敬,死狀恐怖航夺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崔涂,我是刑警寧澤阳掐,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站冷蚂,受9級特大地震影響缭保,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝙茶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一艺骂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隆夯,春花似錦钳恕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宦芦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轴脐,已是汗流浹背调卑。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留大咱,地道東北人恬涧。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像碴巾,于是被迫代替她去往敵國和親溯捆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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