Замена всех событий касания UIButton дросселем
Я хочу глобально запретить пользователю двойное нажатие кнопки. В качестве подтверждения концепции я начал переопределять метод 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, поэтому любые рекомендации о том, с чего начать устранение неполадок или альтернативные предложения будут оценены.
1 ответ
От Apple:
Лучшим решением было бы создать новый метод, вместо того, чтобы пытаться переопределить текущий, и выполнить глобальный поиск и замену, чтобы указать на новый метод.
Поскольку вы внедряете RxSwift в свой проект, почему бы не использовать его?
extension Reactive where Base: UIButton {
public var safeTap: ControlEvent<Void> {
return ControlEvent.init(events: tap.throttle(3, latest: false, scheduler: MainScheduler.instance))
}
}