Reputation: 33
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
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
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
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
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