我正在尝试制作一个连接到按钮的倒数计时器,目前正在使用
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/