我想全局阻止用户双击按钮。作为概念验证,我开始覆盖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/

10-13 00:01