防止 UIButton 的連續(xù)點(diǎn)擊,無(wú)非就是網(wǎng)上那三種方法忿墅,前兩種即手動(dòng)設(shè)置 isEnabled宣吱、或者在點(diǎn)擊的時(shí)候取消未執(zhí)行的事件长豁,再延時(shí)執(zhí)行。這里重點(diǎn)說(shuō)一下第三種轩触,即重寫(xiě) load 方法寞酿,在 load 方法的時(shí)候利用 runtime 將方法交換一下,將 sendAction 方法與自定義的 sendAction 方法交換脱柱,在自定義的方法中實(shí)現(xiàn)防止連續(xù)點(diǎn)擊的目的伐弹。
但是由于我們項(xiàng)目使用的是 swift 語(yǔ)言,在 swift 中已經(jīng)廢除了 load 方法榨为,所以只能?chē)L試其他方法惨好,我嘗試了一下后發(fā)現(xiàn)直接重寫(xiě) sendAction(_ action: Selector, to target: Any?, for event: UIEvent?)
即能達(dá)到目的,不必使用方法交換随闺。具體代碼如下:
// 設(shè)置的點(diǎn)擊間隔
var acceptEventInterval: TimeInterval {
set {
objc_setAssociatedObject(self, &UIButtonObjectKeys.acceptEventInterval, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return (objc_getAssociatedObject(self, &UIButtonObjectKeys.acceptEventInterval) as? TimeInterval) ?? 0.0
}
}
// 儲(chǔ)存的上一次點(diǎn)擊時(shí)間
private var acceptEventTime: TimeInterval {
set {
objc_setAssociatedObject(self, &UIButtonObjectKeys.acceptEventTime, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return (objc_getAssociatedObject(self, &UIButtonObjectKeys.acceptEventTime) as? TimeInterval) ?? 0.5
}
}
open override func sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
// 如果這次點(diǎn)擊時(shí)間減去上次點(diǎn)擊事件小于設(shè)置的點(diǎn)擊間隔日川,則不執(zhí)行
if Date().timeIntervalSince1970 - self.acceptEventTime < self.acceptEventInterval {
return
}
// 存儲(chǔ)最后一次點(diǎn)擊執(zhí)行的時(shí)間
if self.acceptEventInterval > 0 {
self.acceptEventTime = Date().timeIntervalSince1970
}
// 執(zhí)行action
super.sendAction(action, to: target, for: event)
}
最后說(shuō)一下在用的時(shí)候發(fā)現(xiàn)的一個(gè)小 bug,就是我們項(xiàng)目中的一個(gè)按鈕在為 touchUpInside 添加了兩個(gè) action矩乐,而我設(shè)置的acceptEventInterval
點(diǎn)擊間隔默認(rèn)為 1.0龄句,在此時(shí)由于兩次 action 執(zhí)行的時(shí)間間隔可以忽略不計(jì),此時(shí)只能執(zhí)行一個(gè) action,在這個(gè)要注意一點(diǎn)分歇,就是acceptEventInterval
時(shí)間間隔最好設(shè)置默認(rèn)為 0透葛,需要防止重復(fù)點(diǎn)擊的 Button 設(shè)置為 1.0,以防止在使用的時(shí)候出現(xiàn)問(wèn)題卿樱,當(dāng)然也可以酌情設(shè)置僚害,或者在sendAction(_ action: Selector, to target: Any?, for event: UIEvent?)
方法中利用判斷 action、target繁调、event 等屬性來(lái)解決這個(gè)事情萨蚕,此處不予深究。