用油门代替所有UIButton触摸事件

时间:2018-10-29 21:19:29

标签: ios swift rx-swift

我希望全局阻止用户双击按钮。作为概念验证,我开始覆盖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还是很陌生,因此,任何有关在哪里开始进行故障排除的指导或替代建议的信息都将不胜感激。

1 个答案:

答案 0 :(得分:0)

从Apple:

  

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))
    }
}