swift 在视图中的if语句上停止计时器

wecizke3  于 2022-12-10  发布在  Swift
关注(0)|答案(1)|浏览(153)

我是Swift的新手,我对一个问题感到绝望。我创建了一个类,其中有两个函数来启动和停止计时器。有一个结构体用onAppear启动计时器(启动函数)。在结构体中有一个按钮来停止时间。

import SwiftUI

class StopWatch: ObservableObject {
    @Published var secondsElapsed = 0.0
    var timer = Timer()
    
    func startTimer() {
        timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
            self.secondsElapsed += 0.1 }
    }
    func stopTimer() {
        timer.invalidate()
    }
}

struct Test: View {
    @ObservedObject var stopWatch = StopWatch()
    var body: some View {
        VStack{
            Button("Stop") {
                stopWatch.stopTimer()
            }
            Text(String(format: "%.1f", self.stopWatch.secondsElapsed))
        }.onAppear(perform: {stopWatch.startTimer()})
    }
}

如果视图启动,计时器就会启动。到目前为止一切都很好:-)。但是我想去掉停止按钮,用一个if语句代替它,比如:
如果stopWatch.已用秒数〉5.0 { stopWatch.stopTimer()}
我想通过这个if语句在没有用户操作的情况下停止计时器,当前的计时器值应该会显示出来。
我尝试了几个小时,但我没有得到它。对于这种情况,我得到了错误消息“Type '()'不能符合'View'",但我尝试了很多其他的事情,并得到了很多其他的错误。有人能帮助我吗?

jogvjijk

jogvjijk1#

如果你想让计时器在5秒时停止,你应该在计时器的闭包中这样做。你可以这样做:

func startTimer() {
    timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
        self.secondsElapsed += 0.1
        if self.secondselapsed == 5.0 {
            timer.invalidate()
        }
    }
}

您会得到这个错误(“Type '()' cannot conformer to 'View'"),因为您尝试在SwiftUI视图的主体中执行代码而不返回视图。如果您出于某种原因确实想在主体中执行此操作,您可以这样做:(我不建议这样做)

if stopWatch.secondsElapsed > 5.0 {
    Text("Five seconds elapsed")
        .onAppear {
            stopWatch.stop()
        }
}

相关问题