防止用户每秒按下按钮x次

3

我在应用程序中有一个UIButton,允许用户向API发送请求。

如何防止用户每秒按下此按钮超过X次?

2个回答

3
我认为您希望忽略按钮上频繁的点击,但您不需要在忽略时将按钮设置为不可用状态。(如果您想改变按钮的外观,您需要使用NSTimer或其他延迟操作来重新启用按钮,这是一个重要的复杂操作。)
如果您将需求更改为“两次点击之间至少有1/X秒”,则会更简单。例如,我们不再允许每秒最多4次点击,而是忽略在上一次点击后小于1/4秒内的点击。
为了实现此要求,请储存上一次点击的时间。当出现新的点击时,请查看与上一次点击之间是否已经过去了1 / X秒。如果没有,则忽略此次点击。
    private let minimumTapInterval = 1 / CFTimeInterval(4)
    private var lastTapTime = CFAbsoluteTime(0)

    @IBAction func buttonWasTapped(sender: AnyObject?) {
        let now = CFAbsoluteTimeGetCurrent()
        guard now >= lastTapTime + minimumTapInterval else { return }
        lastTapTime = now
        sendAPIRequest()
    }

如果您真的想实现“每秒不超过X次点击”的要求,可以存储接受的点击时间。当新的点击事件发生时,抛弃一个秒之前的所有存储时间。如果仍然有至少X个存储的时间,则忽略新的点击。
    private let maxTapsPerSecond = 4
    private var tapTimes = [CFAbsoluteTime]()

    @IBAction func buttonWasTapped(sender: AnyObject?) {
        let now = CFAbsoluteTimeGetCurrent()
        let oneSecondAgo = now - 1
        tapTimes = tapTimes.filter { $0 >= oneSecondAgo }
        // All elements of tapTimes are now within the last second.
        guard tapTimes.count < maxTapsPerSecond else { return }
        tapTimes.append(now)
        sendAPIRequest
    }

0
你可以使用UIButtonisEnabled属性。对于你的按钮目标,在你的@objc选择器函数的末尾添加以下内容:
@objc func handleMyButtonPress() {

    self.someOtherFunction()

    myButton.isEnabled = false

    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {

        myButton.isEnabled = true
    }
}

.now() + 1 截止时间基本上是指,1秒后按钮将再次启用,您的用户可以与其进行交互。

如果需要5分钟的延迟,您可以使用 .now() + (60 * 5)

我自己使用这个方法,在几乎任何情况下都能可靠地运行。

希望这个答案能够帮助您或其他遇到相同问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接