UIButton根据计数同时点击操作

问题描述 投票:0回答:1

如果用户点击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)
            }
        }
    }

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

谢谢

uibutton ibaction swift4.2
1个回答
1
投票

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

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
}
© www.soinside.com 2019 - 2024. All rights reserved.