导航视图控制器时倒计时计时器不起作用 swift?
CountDown timer didn't work when navigating the view controller swift?
倒计时在后台进行得很顺利,当我最小化应用程序计时器时仍然倒计时。但是当我导航 FirstViewController
到 SecondViewController
并从 SecondViewController
单击后退按钮转到 firstViewController
时,计时器不会继续倒计时。我想,当我回到第一个视图控制器时,计时器仍在倒计时。
这是我的代码
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var timerLabel: UILabel!
var countdownTimer: Timer!
var totalTime = 200
override func viewDidLoad() {
super.viewDidLoad()
startTimer()
}
func startTimer() {
countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
@objc func updateTime() {
timerLabel.text = "\(timeFormatted(totalTime))"
if totalTime != 0 {
totalTime -= 1
} else {
endTimer()
}
}
func endTimer() {
countdownTimer.invalidate()
}
func timeFormatted(_ totalSeconds: Int) -> String {
let seconds: Int = totalSeconds % 60
let minutes: Int = (totalSeconds / 60) % 60
// let hours: Int = totalSeconds / 3600
return String(format: "%02d:%02d", minutes, seconds)
}
@IBAction func nextScreen(_ sender: UIButton) {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController")
navigationController?.pushViewController(vc, animated: true)
}
}
这是我在 AppDelegate 中的代码,使计时器在后台仍然 运行:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var backgroundUpdateTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
func applicationWillResignActive(_ application: UIApplication) {
self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundUpdateTask()
})
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
self.endBackgroundUpdateTask()
}
func endBackgroundUpdateTask() {
UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskIdentifier.invalid
}
func applicationDidBecomeActive(_ application: UIApplication) {
application.applicationIconBadgeNumber = 0
}
}
秒ViewController:
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func backToFirstScreen(_ sender: UIButton) {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstViewController")
navigationController?.pushViewController(vc, animated: true)
}
}
这是故事板中的图像视图控制器
@IBAction func backToFirstScreen(_ sender: UIButton)
{
navigationController?.popViewController(animated:true)
}
您没有返回,而是创建了另一个第一个视图控制器对象,该对象启动了另一个计时器。这是我在您的代码中看到的唯一问题
这是因为您没有返回到 firstViewController!
您正在创建 firstViewController 的新实例并将其推送到 secondViewController。
要返回,您可以弹出第二个 ViewController:
@IBAction func backToFirstScreen(_ sender: UIButton) {
self.navigationController?.popViewController(animated: true)
}
倒计时在后台进行得很顺利,当我最小化应用程序计时器时仍然倒计时。但是当我导航 FirstViewController
到 SecondViewController
并从 SecondViewController
单击后退按钮转到 firstViewController
时,计时器不会继续倒计时。我想,当我回到第一个视图控制器时,计时器仍在倒计时。
这是我的代码
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var timerLabel: UILabel!
var countdownTimer: Timer!
var totalTime = 200
override func viewDidLoad() {
super.viewDidLoad()
startTimer()
}
func startTimer() {
countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
@objc func updateTime() {
timerLabel.text = "\(timeFormatted(totalTime))"
if totalTime != 0 {
totalTime -= 1
} else {
endTimer()
}
}
func endTimer() {
countdownTimer.invalidate()
}
func timeFormatted(_ totalSeconds: Int) -> String {
let seconds: Int = totalSeconds % 60
let minutes: Int = (totalSeconds / 60) % 60
// let hours: Int = totalSeconds / 3600
return String(format: "%02d:%02d", minutes, seconds)
}
@IBAction func nextScreen(_ sender: UIButton) {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController")
navigationController?.pushViewController(vc, animated: true)
}
}
这是我在 AppDelegate 中的代码,使计时器在后台仍然 运行:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var backgroundUpdateTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
func applicationWillResignActive(_ application: UIApplication) {
self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundUpdateTask()
})
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
self.endBackgroundUpdateTask()
}
func endBackgroundUpdateTask() {
UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskIdentifier.invalid
}
func applicationDidBecomeActive(_ application: UIApplication) {
application.applicationIconBadgeNumber = 0
}
}
秒ViewController:
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func backToFirstScreen(_ sender: UIButton) {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstViewController")
navigationController?.pushViewController(vc, animated: true)
}
}
这是故事板中的图像视图控制器
@IBAction func backToFirstScreen(_ sender: UIButton)
{
navigationController?.popViewController(animated:true)
}
您没有返回,而是创建了另一个第一个视图控制器对象,该对象启动了另一个计时器。这是我在您的代码中看到的唯一问题
这是因为您没有返回到 firstViewController!
您正在创建 firstViewController 的新实例并将其推送到 secondViewController。
要返回,您可以弹出第二个 ViewController:
@IBAction func backToFirstScreen(_ sender: UIButton) {
self.navigationController?.popViewController(animated: true)
}