我想启动一个 60 秒的计时器来测试用户在该分钟内可以键入多少个单词。我开始计算文本字段中的字符数。但是现在我需要减少一个计时器,以便我可以进行数学运算并将答案打印出来给用户。不过,当计时器不在内容视图结构中时,我似乎无法弄清楚如何使用计时器。我能做到吗?
import SwiftUI
struct ContentView: View {
@State var userInput = ""
@State var modalview = false
@State var getstarted = false
@EnvironmentObject var timerHolder : TimerHolder
var body: some View {
ZStack() {
modalView(modalview: $modalview, userInput: userInput)
}.sheet(isPresented: $modalview) {
modalView(modalview: self.$modalview)
}
}
}
struct modalView : View {
@ObservedObject var durationTimer = TimerHolder()
@Binding var modalview : Bool
@State var userInput: String = ""
var body: some View {
VStack{
Button(action: {
self.modalview = true
}) {
TextField("Get Started", text:$userInput)
.background(Color.gray)
.foregroundColor(.white)
.frame(width: 300, height: 250)
.cornerRadius(20)
Text("(userInput.count)")
Text("(durationTimer.count) Seconds")
}
}
}
}
class TimerHolder : ObservableObject {
var timer : Timer!
@Published var count = 0
func start() {
self.timer?.invalidate()
self.count = 0
self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
_ in
self.count += 1
print(self.count)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
}
简单的一个,因为你把它当作财产,是从.onAppear
开始......(当然,假设你在ContentView
创作时ContentView().environmentObject(TimerHolder())
传递它(
struct ContentView: View {
@State var userInput = ""
@State var modalview = false
@State var getstarted = false
@EnvironmentObject var timerHolder : TimerHolder
var body: some View {
ZStack() {
modalView(modalview: $modalview, userInput: userInput)
}.sheet(isPresented: $modalview) {
modalView(modalview: self.$modalview)
}
.onAppear {
self.timerHolder.start()
}
}
}