swift語(yǔ)言 使用method_exchangeImplementations 交換原生方法不行了 ,fuck
今天想做一個(gè)小需求,防止UIButton在多時(shí)間內(nèi)多次點(diǎn)擊逸雹。
import UIKit
private var UIControl_ignoreEvent = "UIControl_ignoreEvent"
extension UIControl {
//添加點(diǎn)擊事件的間隔事件
var xh_acceptEventInterval:NSTimeInterval {
get {
let acceptEventInterval = objc_getAssociatedObject(self, #function) as? NSTimeInterval
return acceptEventInterval ?? 0
}
set {
objc_setAssociatedObject(self, #function, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
//是否忽略點(diǎn)擊事件驶社,不響應(yīng)點(diǎn)擊事件
func setXh_ignoreEvent(newValue:Bool) {
objc_setAssociatedObject(self, &UIControl_ignoreEvent, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
func xh_ignoreEvent() -> Bool {
let ignoreEvent = objc_getAssociatedObject(self, &UIControl_ignoreEvent) as? Bool
return ignoreEvent ?? false
}
override public class func initialize() {
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken) {
let originalSelector = class_getInstanceMethod(self, #selector(UIControl.sendAction(_:to:forEvent:)))
let swizzledSelector = class_getInstanceMethod(self, #selector(UIControl.__xh_sendAction(_:to:forEvent:)))
method_exchangeImplementations(swizzledSelector,originalSelector)
}
}
func __xh_sendAction(action: Selector, to target: AnyObject?, forEvent event: UIEvent?) {
print("走了替換后的方法")
if self.xh_ignoreEvent() {
return
}
if self.xh_acceptEventInterval > 0 {
self.setXh_ignoreEvent(true)
self.performSelector(#selector(setXh_ignoreEvent(_:)), withObject: false, afterDelay: self.xh_acceptEventInterval)
}
self.__xh_sendAction(action, to: target, forEvent: event)
}
}
可惜 swift語(yǔ)言 使用method_exchangeImplementations 交換原生方法不行了
參考:https://stackoverflow.com/questions/33096873/method-swizzling-does-not-work