Попытка вызвать окно оповещения через 60 секунд. И это не сработает - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь заставить это оповещение работать последние два часа. Я не знаю, почему это не так. Могу ли я даже заставить его работать прямо там?

class TimerHolder : ObservableObject {
@State var showResults = false
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)

        if self.count < 60 {
            self.count += 1
            print(self.count)

        }else{


            _ = Alert(title: Text("Warning"), message: Text("The timer will start as soon as you press OK. "), primaryButton: .default(Text("OK"), action: {})
                , secondaryButton: .cancel(Text("Not yet.")))
        }
            }
        }
    }





struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Alert в SwiftUI должен быть представлен с помощью модификатора .alert в иерархии представления, поэтому он должен выглядеть следующим образом

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
            if (self.count < 60) {
                self.count += 1 // << no views here, only calculations
            }
        }
    }

    func stop() {
        self.timer?.invalidate()
    }
}

где-то в представлении

struct DemoView : View {
    @ObservedObject var durationTimer = TimerHolder()

    @State private var showAlert = false // state of presenting alert
    var body: some View {

        VStack{
            Text("\(durationTimer.count) Seconds")
        }
        .onReceive(durationTimer.$count) { count in // << listen for timer
            if count == 60 { // << show alert
                durationTimer.stop()
                self.showAlert = true
            }
        }
        .alert(isPresented: $showAlert) { // alert section, condition + construction
            Alert(title: Text("Warning"), message: Text("The timer will start as soon as you press OK. "), primaryButton: .default(Text("OK"), action: {})
                , secondaryButton: .cancel(Text("Not yet.")))
        }
    }
}
0 голосов
/ 25 января 2020

Кажется, вы делаете три левых, чтобы повернуть направо. ObservableObject должен быть только держателем данных.

Мне кажется, было бы лучше, если бы вы делали это вне ObservableObject и чтобы таймер удерживался в View или ViewController.

class StartViewController: UIViewController {

var displayTimer: Timer!

override func viewDidLoad() {
    super.viewDidLoad()

    //setup the Timer
    displayTimer = Timer.scheduledTimer(timeInterval: 60.0,
                         target: self,
                         selector: #selector(self.displayTimerFired(_:)),
                         userInfo: nil,
                         repeats: false)

}

@objc func displayTimerFired(_ timer: Timer) {

    let alertController = UIAlertController(title: "60 Seconds...", message: "60 Seconds have elapsed.", preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "OK",  style: .default, handler: nil))
    self.present(alertController, animated: true, completion: nil)

    //clean up timer
    displayTimer.invalidate()


}

}

РЕДАКТИРОВАТЬ

Извините, только что вы поняли, что вы используя SwiftUI

struct TimerView: просмотр {

let timer = Timer.publish(every: 60, on: .main, in: .common).autoconnect()

var body: some View {
        .onReceive(timer) { _ in
             _ = Alert(title: Text("Warning"), message: Text("The timer will start as soon as you press OK. "), primaryButton: .default(Text("OK"), action: {})
            , secondaryButton: .cancel(Text("Not yet.")))

        }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...