Замена всех событий касания UIButton дросселем - PullRequest
0 голосов
/ 30 октября 2018

Я хочу глобально запретить пользователю двойное нажатие кнопки. В качестве подтверждения концепции я начал переопределять метод 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 Ответ

0 голосов
/ 30 октября 2018

от Apple:

Расширения могут добавлять новые функциональные возможности к типу, но они не могут переопределять существующие функциональные возможности.

Лучшим решением было бы создать новый метод вместо попытки переопределить текущий и выполнить глобальный поиск и замену, чтобы указать на новый метод.

Поскольку вы используете RxSwift в своем проекте, почему бы не использовать его?

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