Alexis Decloedt
Alexis Decloedt

Reputation: 33

Counter reset to zero after change of ViewController

I've implemented a counter in my app, and it works. Then, when I change of ViewController (When i run my app), my counter reset to 0 automatically. I want my counter to continue while i'm using the app.

Thank's for your Help :)

import UIKit

class ViewController: UIViewController
{
    /// Label
    private var customLabel : UILabel?

    /// MAximum Count to which label will be Updated
    private var maxCount : Int?
    /// Count which is currently displayed in Label
    private var currentCount : Int?
    /// Timer To animate label text
    private var updateTimer : Timer?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        customLabel = UILabel()
        customLabel?.textColor = .white
        customLabel?.font = UIFont(name: "HelveticaNeue-Bold", size: 25)
        customLabel?.textAlignment = .center


        /// Add label to View
        addConstraints()

        /// Start Timer
        DispatchQueue.main.async {
            self.maxCount = 600
            self.currentCount = 1
            self.updateTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(ViewController.updateLabel), userInfo: nil, repeats: true)
        }
    }

    @objc func updateLabel() {
        self.customLabel?.text = String(currentCount!)
        currentCount! += 1
        if currentCount! > maxCount! {
            /// Release All Values
            self.updateTimer?.invalidate()
            self.updateTimer = nil
            self.maxCount = nil
            self.currentCount = nil
        }
    }

    func addConstraints(){
        /// Add Required Constraints
        self.view.addSubview(customLabel!)
        customLabel?.translatesAutoresizingMaskIntoConstraints = false
        customLabel?.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 195).isActive = true
        customLabel?.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -50).isActive = true
        customLabel?.heightAnchor.constraint(equalToConstant: 50).isActive = true
        customLabel?.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 310).isActive = true
    }
}

Upvotes: 1

Views: 523

Answers (4)

Federica Benacquista
Federica Benacquista

Reputation: 843

Declare these two var and let:

var defaults  = UserDefaults.standard
let countKey = "CountKey"

Add this line of code whenever you update your counter:

defaults.set(currentCount, forKey: countKey)

To get back your value instead, use:

defaults.integer(forKey: countKey)

Upvotes: 1

Canberk Ersoy
Canberk Ersoy

Reputation: 438

Your counter is actually part of your view controller which lives in memory, and when you restart your app (from Xcode I assume). It is removing your app from device memory, that's why you are losing your timer count.

Best thing you can do is saving you timer count to User Defaults (which saves it to disk), which means when you reopen your app you can get it from User Defaults and continue changing your current count

Upvotes: 0

Zeeshan Ahmed
Zeeshan Ahmed

Reputation: 864

My recommendation would be implementing the Timer thing in your root controller which will not die until your app gets terminated like your Navigation Controller/Tab Controller, and keep updating the label whenever the 'ViewController' appears.

Thats how it will work even when the Controller is dead.

Upvotes: 0

Jai Nijhawan
Jai Nijhawan

Reputation: 3

What actually happening is that whenever you come back to your ViewController You are creating a new counter What you need to do is Declare your counter Outside viewDidLoad() but make sure that your ViewController is the root ViewController of your app that never gets deinitialised otherwise your app will crash.

Upvotes: 0

Related Questions