ios - 用 Throttle 替换所有 UIButton 触摸事件

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

调用此代码时,我收到错误访问错误:

Thread 1: EXC_BAD_ACCESS (code=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/

相关文章:

javascript - 如何使用棘轮启用 push.js ajax 内容加载器

iphone - 如何在 UIButton 动画时识别触摸事件

swift - 如何在 Swift 中的 TTTAttributedLabel、OHAttributedLabel 或 SETextView 上设置 "NSBackgroundColorAttributeName"

swift - 将工具栏重构为另一个文件

ios - RxSwift 触发可观察执行

ios - 如何快速比较颜色

ios - 谓词 "IN"在设备上非常慢(相差 83 倍)

ios - 模态VC未打开(Swift)

ios - RxSwift 无法识别订阅方法

使用 RxSwift 登录 Facebook