ios - 快速创建单独的计时器

标签 ios swift swift4 nstimer

我正在尝试制作一个连接到按钮的倒数计时器,目前正在使用

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.clock), userInfo: nil, repeats: true)

但是,我想要这样,如果我按下同一个按钮,一个新的计时器将以类似的设置启动,所以在控制台中有 2 个、3 个等倒计时计时器同时运行。 我该如何做到这一点,每当我按下按钮时,都会生成一个新计时器,其设置与之前的设置相同,但旧计时器仍处于事件状态并在滴答作响?

最佳答案

要跟踪各种计时器,您需要创建一个计时器数组 ([Timer]) 并创建一个 TimerState 以作为 userInfo 对象。然后,当 updateTimer() 被调用时,您可以访问该计时器的 state 作为 timer.userInfo 并使用它。当计时器达到 0 时,调用 invalidate() 并将其从计时器列表中删除。

如果用户按下 Stop All Timers 按钮,则使用 timers 数组停止所有事件的计时器。

import UIKit

class TimerState {
    let number: Int
    var count: Int

    init(number: Int, count: Int) {
        self.number = number
        self.count = count
    }
}

class ViewController: UIViewController {

    var timerNumber = 1
    var startingCount = 10

    // Array to hold active timers so that all can be stopped
    var timers = [Timer]()

    @IBAction func startTimer(_ sender: UIButton) {
        let state = TimerState(number: timerNumber, count: startingCount)

        let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: state, repeats: true)

        timers.append(timer)

        timerNumber += 1
    }

    @objc func updateTimer(_ timer: Timer) {
        guard let state = timer.userInfo as? TimerState else { return }
        state.count -= 1
        if state.count == 0 {
            print("Timer \(state.number) is done")
            timer.invalidate()

            // remove this timer from the list of active timers
            if let index = timers.firstIndex(of: timer) {
                timers.remove(at: index)
            }
        } else {
            print("Timer \(state.number): \(state.count)")
        }
    }

    @IBAction func stopAllTimers(_ sender: UIButton) {
        for timer in timers {
            guard let state = timer.userInfo as? TimerState else { continue }
            print("Timer \(state.number) stopped")

            timer.invalidate()
        }
    }
}

Start Timer 按钮 3 次会在控制台中产生以下输出:

Timer 1: 9
Timer 1: 8
Timer 1: 7
Timer 2: 9
Timer 1: 6
Timer 2: 8
Timer 1: 5
Timer 2: 7
Timer 3: 9
Timer 1: 4
Timer 2: 6
Timer 3: 8
Timer 1: 3
Timer 2: 5
Timer 3: 7
Timer 1: 2
Timer 2: 4
Timer 3: 6
Timer 1: 1
Timer 2: 3
Timer 3: 5
Timer 1 is done
Timer 2: 2
Timer 3: 4
Timer 2: 1
Timer 3: 3
Timer 2 is done
Timer 3: 2
Timer 3: 1
Timer 3 is done

关于ios - 快速创建单独的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854089/

相关文章:

ios - 谷歌地图在 iOS Swift 中按经纬度放置信息

ios - 限制动态 UIScrollView 的约束范围

ios - ReactiveCocoa takeUntil : doesn't send completion?

ios - 苹果 iOS : [AVAssetWriterInput appendSampleBuffer:] Cannot call method when status is 0

ios - Xcode 8 在启动时挂起; [MT] DVTAsertions 警告

ios - Collection View 单元格导航

ios - 在xcode中更新cocos2d,添加kazmath

ios - 选择和取消选择 UITableViewCells - Swift

swift - viewForSupplementaryElementOfKind 在 Collection View 滚动之前不会设置标签文本

Swift - 将 X 数据数组分配给它的部分