我想全局阻止用户双击按钮。作为概念验证,我开始覆盖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还是很陌生,因此,任何有关在哪里开始进行故障排除的指南或替代建议都将不胜感激。
最佳答案
从苹果公司:
Extensions can add new functionality to a type, but they cannot override existing functionality.
更好的解决方案是制作一个新方法,而不是尝试覆盖当前方法,并进行全局查找和替换以指向新方法。
由于将RxSwift引入项目中,为什么不使用它呢?
extension Reactive where Base: UIButton {
public var safeTap: ControlEvent<Void> {
return ControlEvent.init(events: tap.throttle(3, latest: false, scheduler: MainScheduler.instance))
}
}
关于ios - 用 throttle 代替所有UIButton触摸事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53053990/