首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Throttle替换所有UIButton触摸事件

用Throttle替换所有UIButton触摸事件
EN

Stack Overflow用户
提问于 2018-10-29 21:19:28
回答 1查看 1.2K关注 0票数 0

我想在全球范围内防止用户双击按钮。作为概念的证明,我开始重写UI按钮的addTarget方法,并使用RxSwift将原始调用替换为节流调用:

代码语言:javascript
复制
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 (code=EXC_I386_GPFLT)

我对Swift非常陌生,所以任何关于从哪里开始故障排除或其他建议的指导都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-10-30 01:32:34

来自苹果:

扩展可以向类型添加新功能,但它们不能覆盖现有功能。

更好的解决方案是创建一个新方法,而不是试图覆盖当前方法,并执行全局查找和替换以指向新方法。

既然您正在将RxSwift引入您的项目,为什么不使用它呢?

代码语言:javascript
复制
extension Reactive where Base: UIButton {
    public var safeTap: ControlEvent<Void> {
        return ControlEvent.init(events: tap.throttle(3, latest: false, scheduler: MainScheduler.instance))
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53053990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档