我想在我的应用程序中有一个秒表,它完全消耗了设备的时间。下面是我的代码,它需要按下“开始”按钮的时间,然后每秒钟更新secondsElapsed以表示startTime和current之间的区别。我被困在实现暂停函数上了。如果我只是使更新计时器失效,那么定时器将重新启动,从它停止的位置开始进行。对该怎么做有什么想法吗?
class StopWatchManager: ObservableObject{
@Published var secondsElapsed = 0
var startTime: Date = Date()
var timer = Timer()
func startWatch(){
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ timer in
let current = Date()
let diffComponents = Calendar.current.dateComponents([.second], from: self.startTime, to: current)
let seconds = (diffComponents.second ?? 0)
self.secondsElapsed = seconds
}
}
func pauseWatch(){
timer.invalidate()
}
}我使用下面的代码显示秒表:
struct ContentView: View {
@ObservedObject var stopWatchManager = StopWatchManager()
var body: some View{
HStack{
Button("Start"){
stopWatchManager.startWatch()
}
Text("\(stopWatchManager.secondsElapsed)")
Button("Pause"){
stopWatchManager.pauseWatch()
}
}
}
}发布于 2020-12-11 23:46:14
是。以下是如何做到这一点:
当按下
startTime并重新启动更新定时器.以下是更新的代码:
class StopWatchManager: ObservableObject{
@Published var secondsElapsed = 0
var startTime: Date = Date()
var elapsedTime = 0.0
var paused = false
var running = false
var timer = Timer()
func startWatch(){
guard !running else { return }
if paused {
startTime = Date().addingTimeInterval(-elapsedTime)
} else {
startTime = Date()
}
paused = false
running = true
timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true){ timer in
let current = Date()
let diffComponents = Calendar.current.dateComponents([.second], from: self.startTime, to: current)
let seconds = (diffComponents.second ?? 0)
self.secondsElapsed = seconds
}
}
func pauseWatch(){
guard !paused else { return }
timer.invalidate()
elapsedTime = Date().timeIntervalSince(startTime)
paused = true
running = false
}
}要注意的事情:
1更改为0.1,以避免缺少更新。paused和running状态变量,以防止按钮连续按一次以上。F 217
https://stackoverflow.com/questions/65259678
复制相似问题