首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于StopWatch of Date() - SwiftUI

基于StopWatch of Date() - SwiftUI
EN

Stack Overflow用户
提问于 2020-12-11 22:50:12
回答 1查看 283关注 0票数 0

我想在我的应用程序中有一个秒表,它完全消耗了设备的时间。下面是我的代码,它需要按下“开始”按钮的时间,然后每秒钟更新secondsElapsed以表示startTime和current之间的区别。我被困在实现暂停函数上了。如果我只是使更新计时器失效,那么定时器将重新启动,从它停止的位置开始进行。对该怎么做有什么想法吗?

代码语言:javascript
复制
    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()
    }
    
}

我使用下面的代码显示秒表:

代码语言:javascript
复制
struct ContentView: View {
    
    @ObservedObject var stopWatchManager = StopWatchManager()
    
    var body: some View{
        HStack{
            Button("Start"){
                stopWatchManager.startWatch()
            }
            Text("\(stopWatchManager.secondsElapsed)")
            Button("Pause"){
                stopWatchManager.pauseWatch()
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-11 23:46:14

是。以下是如何做到这一点:

当按下

  1. 时,请注意当前时间,并计算计时器所用的时间。当计时器恢复时,使更新计时器无效。
  2. ,取当前时间并减去所用时间。使其成为startTime并重新启动更新定时器.

以下是更新的代码:

代码语言:javascript
复制
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
    }
    
}

要注意的事情:

  • I将计时器间隔从1更改为0.1,以避免缺少更新。
  • 添加了pausedrunning状态变量,以防止按钮连续按一次以上。

F 217

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65259678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档