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

时间:2016-03-02 15:42:00

标签: ios swift uibutton

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

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

2 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:0)

您可以使用 isEnabledUIButton 属性。 对于按钮的目标,在 @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)

我自己使用它,它几乎在任何情况下都能可靠地工作。

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