Замена всех событий касания 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))
    }
}
Другие вопросы по тегам