Поэтому я создал приложение, которое должно получать слова в минуту. Как запустить таймер, которого нет в ContentView, с SwithUI - PullRequest
2 голосов
/ 24 января 2020

Я хочу запустить таймер на 60 секунд, чтобы проверить, сколько слов пользователь может набрать за эту минуту. Я начал считать символы в TextField. Но теперь мне нужно уменьшить таймер, чтобы я мог сделать математику и распечатать ответ для пользователя. Кажется, я не могу понять, как использовать таймер, когда он не в структуре Content View. Могу я это сделать?

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() 
    }
}

}

1 Ответ

1 голос
/ 24 января 2020

Самое простое, поскольку вы держите его как свойство, это начинать с .onAppear ... (если, конечно, вы передадите его в ContentView().environmentObject(TimerHolder()) при ContentView создании)

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()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...