美文网首页
防止按钮重复点击

防止按钮重复点击

作者: foolish_hungry | 来源:发表于2018-08-24 11:23 被阅读0次

第一种方式

1. 给UIButton 添加扩展
UIButton+tapTime

import UIKit
import Foundation

extension UIButton {
    
    private static var ForbidIntervalKey = "ForbidIntervalKey"
    private static var LastClickTimeKey = "LastClickTimeKey"
    
    /// 按钮不能被重复点击的时间间隔(默认两秒)
    var forbidInterval: TimeInterval {
        get {
            if let interval = objc_getAssociatedObject(self, &UIButton.ForbidIntervalKey) as? TimeInterval {
                return interval
            }
            return 2
        }
        set {
            objc_setAssociatedObject(self, &UIButton.ForbidIntervalKey, newValue as TimeInterval, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    /// 存储上次点击的时间(默认是1970年的时间)
    private var lastClickDate: Date {
        get {
            if let lastDate = objc_getAssociatedObject(self, &UIButton.LastClickTimeKey) as? Date {
                return lastDate
            }
            return Date.init(timeIntervalSince1970: 0)
        }
        set {
            objc_setAssociatedObject(self, &UIButton.LastClickTimeKey, newValue as Date, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    func startForbidContinuousClick() {
        
        if let originalMethod: Method = class_getInstanceMethod(self.classForCoder, #selector(UIButton.sendAction)),
            
            let newMethod: Method = class_getInstanceMethod(self.classForCoder, #selector(UIButton.jf_sendAction(action:to:forEvent:))) {
            
            method_exchangeImplementations(originalMethod, newMethod)
            
        }
    }
    
    @objc dynamic func jf_sendAction(action: Selector, to target: AnyObject?, forEvent event: UIEvent?) {
        if Date().timeIntervalSince(lastClickDate) > forbidInterval {
            self.jf_sendAction(action: action, to: target, forEvent: event)
            lastClickDate = Date()
        }
    }
}

2.使用

pushButton.startForbidContinuousClick()
pushButton.forbidInterval = 1.5
@IBAction func pushVC(_ sender: Any) {
        print("被点击了....")
}

💚这种方式代码量大, 每次需要调用方法转换和配置时间

第二种方式

 @IBAction func pushClick(_ sender: Any) {
        let button = sender as! UIButton
        button.isEnabled = false
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            button.isEnabled = true
        }
        /*要做的事*/
        print("被点击了...")
    }

💚 按钮会出现button的非可用状态样式

第三种方式 (RxSwift)

pushButton.rx.tap.asObservable()
        .throttle(2, scheduler: MainScheduler.instance)
        .bind {
            print("被点击了...")
        }
        .disposed(by: bag)

💚 这种方式最简单, 但是需要RxSwift框架

相关文章

网友评论

      本文标题:防止按钮重复点击

      本文链接:https://www.haomeiwen.com/subject/ullbiftx.html