用Throttle替换所有UIButton触摸事件



我想全局防止用户双击按钮。作为概念验证,我开始覆盖UI按钮的addTarget方法,并使用RxSwift:将原始调用替换为节流调用

import Foundation
import RxSwift
import RxCocoa
public extension UIButton {
override open func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControlEvents) {
guard controlEvents == UIControlEvents.touchUpInside,
let viewController = target as? UIViewController
else
{
super.addTarget(target, action: action, for: controlEvents)
return
}
self.rx
.tap
.throttle(3,
latest: false,
scheduler: MainScheduler.instance)
.subscribe({ _ in
viewController.perform(action)
})
}
}

当调用此代码时,我得到一个错误访问错误:

线程1:EXC_BAD_ACCESS(代码=EXC_I386_GPFLT(

我对Swift还很陌生,所以如果有任何关于从哪里开始故障排除的指导或其他建议,我们将不胜感激。

来自苹果:

扩展可以向类型添加新功能,但不能覆盖现有功能。

更好的解决方案是创建一个新方法,而不是试图覆盖当前方法,并进行全局查找和替换以指向新方法。

既然你将RxSwift引入到你的项目中,为什么不使用它呢?

extension Reactive where Base: UIButton {
public var safeTap: ControlEvent<Void> {
return ControlEvent.init(events: tap.throttle(3, latest: false, scheduler: MainScheduler.instance))
}
}

最新更新