Обновить метку при возврате из фона - PullRequest
0 голосов
/ 25 марта 2020

У меня проблема при попытке обновить метку, когда приложение возвращается из фона. Я уже реализовал LocalNotifications для своего приложения таймера и работает отлично, но когда я возвращаюсь в приложение, метка обратного отсчета останавливается. Поэтому в основном я пытаюсь найти способ обновить метку обратного отсчета с оставшимся текущим временем. Буду признателен за любую помощь!

Мой код здесь:

    var timer = Timer()
    var teas = Teas()
    var isTimerRunning = false
    var alarmSound = AVAudioPlayer()
    var playing = false
    var initialValueOfTime = 0


    var timeDuration = 0
    var currentBackgroundDate = Date()

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        NotificationCenter.default.addObserver(self, selector: #selector(teasGoBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(runTimer), name: UIApplication.didBecomeActiveNotification, object: nil)

    }



@objc func runTimer() {


        if isTimerRunning {
            teas.time -= 1
            let difference = Date().timeIntervalSince(self.currentBackgroundDate)
            timeDuration = timeDuration + Int(difference)

            if teas.time <= 0 {
                timer.invalidate()
                startButton.setTitle("Done", for: .normal)
            }
        }
        else {
            teas.time = initialValueOfTime
        }

 @objc func resetTimer() {

        timer.invalidate()
        runTimer()

    }

    @objc func teasGoBackground() {
           timer.invalidate()
           currentBackgroundDate = Date()
       }


  @IBAction func startButtonPressed(_ sender: Any) {


        if !isTimerRunning {
            navigationItem.hidesBackButton = true
            isTimerRunning = true
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(runTimer), userInfo: nil, repeats: true)
            print("time")
            startButton.setTitle("Stop Brewing", for: .normal)
        } else {
            navigationItem.hidesBackButton = false
            isTimerRunning = false
            resetTimer()
            startButton.setTitle("Start Brewing", for: .normal)
        }


    }

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вам нужно добавить своих наблюдателей внутри viewDidLoad(), НЕ в viewDidAppear

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(teasGoBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(runTimer), name: UIApplication.didBecomeActiveNotification, object: nil)

}
0 голосов
/ 01 апреля 2020

Наконец-то я реализовал этот код в своем проекте и работал!

if let date = UserDefaults.standard.object(forKey: "teastart\(teas.id)") as? Date {
                let now = Date()
                let secondsTillNow = now.timeIntervalSince1970
                let previousSeconds = date.timeIntervalSince1970
                let timeSinceStart = secondsTillNow - previousSeconds
                let time = Int(timeSinceStart)
                if time > teas.time {
                    initialValueOfTime = teas.time

                    startButton.setTitle(NSLocalizedString("Start Brewing", comment: ""), for: .normal)
                    UserDefaults.standard.set(false, forKey: "timerunning\(teas.id)")
                } else {
                    initialValueOfTime = teas.time - time

                    startButton.setTitle(NSLocalizedString("Stop Brewing", comment: ""), for: .normal)
                    UserDefaults.standard.set(true, forKey: "timerunning\(teas.id)")
                }
            } else {
                initialValueOfTime = teas.time
                UserDefaults.standard.set(false, forKey: "timerunning\(teas.id)")
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...