Swift таймер запускается сразу после запуска приложения а не при переходе на другой Экран и как это исправить?

Рейтинг: 0Ответов: 1Опубликовано: 04.02.2023

Есть два ViewController-a первый это "MenuVC" и второй "ViewController" Первоначальный экран это "MenuVC" к нему же припоял navigatation Controller и на этом view контролере есть кнопка при нажатия на кнопку выполняется переход на "ViewControler" и сдесь хочу чтобы таймер запустился но он запускается сразу же после запуска приложения как исправить ?

Вопрос: Почему таймер запускается сразу после запуска приложения а не при переходе на другой Экран и как это исправить?

Это мои два вюшки и навигатор

вот action перехода при нажатии на кнопки на "MenuVC"

@IBAction func segueAction(_ sender: UIButton) {
    guard let newVC = storyboard?.instantiateViewController(identifier: "ViewController") else { return }
    
    navigationController?.popToViewController(newVC, animated: true)
}

и вот мой таймер на ViewController

import UIKit

class ViewController: UIViewController {

@IBOutlet var label: UILabel!
var count: Int = 5

var timer: Timer?


override func viewDidLoad() {
    super.viewDidLoad()

    label?.text = "\(count)"
    timerTest()
}
 
func timerTest() {
    timer = Timer.scheduledTimer(timeInterval: 1,
                      target: self,
                      selector: #selector(justFunc),
                      userInfo: nil,
                                     repeats: count == 0 ? false : true
    )

}
@objc func justFunc(){
    label?.text = "\(count)"
    
    if count == 0 {
        timer?.invalidate() 
        guard let newVC = storyboard?.instantiateViewController(identifier: "MenuVC") else { return }
        navigationController?.popToViewController(newVC, animated: true)
    }
    
    count -= 1
    
    
}

}

у мене обратный таймер после чего заканчивается время хочу сделать переход на первый VC т.е "MenuVC"

 @objc func justFunc(){
    label?.text = "\(count)"
    
    if count == 0 {
        timer?.invalidate() 
        guard let newVC = storyboard?.instantiateViewController(identifier: "MenuVC") else { return }
        navigationController?.popToViewController(newVC, animated: true)
    }
    
    count -= 1
    
    
}

Ответы

▲ 0

Так происходит потому, что при выполнении storyboard?.instantiateViewController(identifier: "ViewController") else { return } происходит вызов viewDidLoad в классе ViewController и таймер запускается до того, как происходит переход и показ контроллера. Можно исправить например так

override func viewDidAppear() {
    super.viewDidAppear()

    label?.text = "\(count)"
    timerTest()
}