首页 > 解决方案 > UIButton 同时点击动作取决于计数

问题描述

如果用户单击 1 次且单击/按下少于 5 次,则应调用OneTimeClickAction func ,

如果用户同时或连续 5 次且少于 10 次单击/按下,则应该调用FiveTimeClickAction func

如果用户同时或连续点击/按下超过 10 次,则应该调用tenTimeClickAction func 。

{
        guard let tempDate = self.lastTappedAt else { return }
        let elapsed = Date().timeIntervalSince(tempDate)
        let duration = Int(elapsed)
        print(duration)
        if duration < 2 {
            tapCount = tapCount + 1
            // return
        } else {
            tapCount = 0
        }
        self.lastTappedAt = Date()

        if tapCount > 9 {
            let dispatchTime = DispatchTime.now() + 3.0
            DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
                self.didTappedTenTimes(.happy)
            }

            return
        }
        if ((tapCount < 6) && (duration > 2)) {
            let dispatchTime = DispatchTime.now() + 3.0
            DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
                self.didTappedFiveTimes(.react)
            }
            return
        }
        if tapCount == 0{
            let dispatchTime = DispatchTime.now() + 3.0
            DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
                self.didTapped(.wink)
            }
        }
    }

请随时让我更深入地了解相同的情况,并建议我以更好的方式处理这个问题。

谢谢

标签: uibuttonibactionswift4.2

解决方案


好的,我知道您不想跟踪按下按钮的实际时间,而只想在某个合理的时间内计算点击次数,假设多个点击一个接一个属于同一动作(眨眼,快乐,反应)。

var tapCount = 0
var lastTappedAt: Date = Date()

func scheduleCheckResult() {
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
        let timePassedSinceLastTap = Int(Date().timeIntervalSince(self.lastTappedAt))
        print("last tap was \(timePassedSinceLastTap) ago")

        // Wait a bit more for resolving final reaction. Adjust if you want quicker/slower taps (more than 1s for slower, less for quiceker)
        guard timePassedSinceLastTap > 1 else {
            return self.scheduleCheckResult()
        }

        print("FINISHED WITH: \(self.tapCount)")
        // Verify result
        switch self.tapCount {
        case let n where n >= 10:
            print("Super duper happy")
        case let n where n >= 5:
            print("Very happy")
        default:
            print("Medium happy")
        }

        // Reset state
        self.tapCount = 0
    }
}

@IBAction func didTap() {
    if tapCount == 0 {
        scheduleCheckResult()
    }
    lastTappedAt = Date()
    tapCount += 1
}

推荐阅读