我想在全球范围内防止用户双击按钮。作为概念的证明,我开始重写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 (code=EXC_I386_GPFLT)
我对Swift非常陌生,所以任何关于从哪里开始故障排除或其他建议的指导都将不胜感激。
发布于 2018-10-30 01:32:34
来自苹果:
更好的解决方案是创建一个新方法,而不是试图覆盖当前方法,并执行全局查找和替换以指向新方法。
既然您正在将RxSwift引入您的项目,为什么不使用它呢?
extension Reactive where Base: UIButton {
public var safeTap: ControlEvent<Void> {
return ControlEvent.init(events: tap.throttle(3, latest: false, scheduler: MainScheduler.instance))
}
}https://stackoverflow.com/questions/53053990
复制相似问题