Ios 按下按钮swiftUI时计时器不显示正确的时间

Ios 按下按钮swiftUI时计时器不显示正确的时间,ios,swift,timer,model,swiftui,Ios,Swift,Timer,Model,Swiftui,我正在创建一个计时器应用程序,在屏幕上我用按钮设置计时器,我想更改显示的字符串。在这种情况下,如果我按下“10”秒按钮两次,我只看到10秒,而不是20秒 如何管理添加在一起的几个不同时间的按钮?我做了这个模型,但我认为它是完全错误的,我不知道如何处理它 @ObservedObject var tm: TimeManager var body: some View { VStack { ContdownView(text:t

我正在创建一个计时器应用程序,在屏幕上我用按钮设置计时器,我想更改显示的字符串。在这种情况下,如果我按下“10”秒按钮两次,我只看到10秒,而不是20秒

如何管理添加在一起的几个不同时间的按钮?我做了这个模型,但我认为它是完全错误的,我不知道如何处理它

        @ObservedObject var tm: TimeManager
    
    var body: some View {
        VStack {
            ContdownView(text:tm.timerap, bgColor: .yellow)
                .cornerRadius(16)
                .padding()
                .shadow(radius: 2)
            
            VStack{
                Button(action: { self.tm.start() }) {
                    ButtonView(text: "10 SEC", bgColor: .red)
                        .cornerRadius(16)
                        .padding(.leading, 16)
                }
                Button(action: { self.tm.stop() }) {
                    ButtonView(text: "STOP", bgColor: .red)
                        .cornerRadius(16)
                        .padding(.leading, 16)
                }
            }
        }
    }


class TimeManager:ObservableObject {
        
    var timer = Timer()
        
    var timerap: String = "00:00:00" {
        didSet {
            self.objectWillChange.send()
        }
    }
    
    func start() {
        if !timer.isValid {
            timer = Timer.scheduledTimer(withTimeInterval: 0.0,
                                         repeats: false) { timer in
                self.tick()
            }
        }
    }
    
    func tick() {
        /// aumentiamo il contatore
        timerap = "00:00:10"
    }
    
    func stop() {
        if timer.isValid {
            timer.invalidate()
        } else {
            contatore = 0
            timerap = "00:00:00"
        }
    }
    
    func pausa() {
        if timer.isValid {
            timer.invalidate()
        }
    }
    
    func timeString(_ time:TimeInterval) -> String {
        let hours = Int(time) / 3600
        let minutes = Int(time) / 60
        let seconds = time - Double(minutes) * 60
        return String(format:"%02i:%02i:%02i",hours,minutes,Int(seconds))
    }
}

每次都应该添加秒数,但每次都只是尝试创建计时器对象

这是一个很好的例子。您可以从这里开始重构它 取决于你的要求

很明显,你应该使用Swift的

这里有一些资源供您参考:


很好,正是我所需要的。现在可以正常工作了。最后一件事。管理“保存”功能,然后将其显示在列表中。如何在manager中管理数据?在实践中,我希望能够保存更多的“计时器”,然后在应用程序的另一部分查看它们,并管理各种启动或SOP。很高兴听到它的帮助。您可以添加一个保存按钮,用CoreData保存当前按钮并清除状态。你可以在页面上列出它们。但这是另一个话题。让我们尝试一些东西,如果你被什么东西卡住了,你可以问一个新问题。
import SwiftUI

struct ContentView: View {
    @State var isCounting = false
    @State var remainingSeconds = 10
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    var body: some View {
        VStack {
            Text("\(timeString(from: remainingSeconds))")
                .onReceive(timer) { _ in
                    if isCounting && remainingSeconds > 0 {
                        remainingSeconds -= 1
                    }
                }
        }.padding()
        
        VStack {
            HStack {
                Button("+10 SEC") {
                    remainingSeconds += 10
                }.padding()
                Button("+20 SEC") {
                    remainingSeconds += 20
                }.padding()
            }.padding()
            
            HStack {
                Button("START") {
                    isCounting = true
                }.padding()
                Button("STOP") {
                    isCounting = false
                }.padding()
            }.padding()
        }
    }
    
    private func timeString(from totalSeconds: Int) -> String {
        let hours = totalSeconds / 3600
        let minutes = (totalSeconds % 3600) / 60
        let seconds = totalSeconds % 60
        return String(format:"%02i:%02i:%02i",hours,minutes, seconds)
    }
}