【问题标题】:Counter reset to zero after change of ViewController更改 ViewController 后计数器重置为零
【发布时间】:2020-04-14 17:49:15
【问题描述】:

我在我的应用程序中实现了一个计数器,它可以工作。然后,当我更改 ViewController(当我运行我的应用程序时)时,我的计数器会自动重置为 0。我希望我的计数器在我使用该应用程序时继续运行。

感谢您的帮助:)

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
    }
}

【问题讨论】:

  • 您可以声明一个全局变量,也可以使用结构体来存储变量。检查我的答案。
  • 也许每次你创建一个新的视图控制器(小心 - 可能存在内存泄漏)并且计数器重新开始。我已经用两个 ViewController(在它们之间切换)测试了您的代码 - 计数器继续工作。所以问题是视图控制器生命周期的实现,而不是计数器的实现
  • 感谢@VadimNikolaev。你是对的,这是一个 ViewController 问题。我刚刚看到,对于我的一些 viewController,计数器会继续,但有些会重置为 0。我该如何解决这个问题?
  • @AlexisDecloedt 了解如何修复它 - 您需要查看创建已发布视图控制器(创建视图控制器的位置)的完整实现。仅供参考:使用强制展开存在应用程序崩溃的高风险,请尝试使用不同的选项来设置变量(例如,预定义变量,如 private let maxCount : Int = 600private var currentCount : Int = 1
  • @VadimNikolaev 我在哪里可以找到创建视图控制器的确切位置? (对不起,我是初学者)。我看不出我的不同 ViewController 有什么区别:/

标签: swift xcode timer count reset


【解决方案1】:

实际发生的情况是,每当您返回 ViewController 时,您正在创建一个新计数器您需要做的是在 viewDidLoad() 之外声明您的计数器,但要确保您的 ViewController 是您的应用程序的根 ViewController 永远不会获取取消初始化,否则您的应用会崩溃。

【讨论】:

  • 所以你是说只有rootViewControllers可以做到这一点?
  • 要跟踪时间,您应该始终将 Timer 实例保存在内存中。您也可以通过在应用程序中委托计时器并在应用程序内存不足后清除它来做到这一点
  • 谢谢小伙子。我在哪里可以找到我的根视图控制器? @JaiNijhawan
  • 根视图控制器被称为第一个视图控制器或应用程序启动后的第一个屏幕
【解决方案2】:

我的建议是在你的根控制器中实现 Timer 东西,直到你的应用程序像导航控制器/选项卡控制器一样被终止时才会消失,并在“ViewController”出现时不断更新标签。

即使 Controller 死了,它也会这样工作。

【讨论】:

  • 谢谢@ZeeshanAhmed。我在哪里可以找到我的根控制器? (对不起,我是初学者)
  • 在您的 appdelegate.swift 文件中,您将设置一个初始控制器。
  • 检查这个问题以获得根控制器stackoverflow.com/questions/26753925/…
【解决方案3】:

你的计数器实际上是你的视图控制器的一部分,它存在于内存中,当你重新启动你的应用程序时(我假设来自 Xcode)。它正在从设备内存中删除您的应用,这就是您丢失计时器计数的原因。

您可以做的最好的事情是将计时器计数保存到用户默认值(将其保存到磁盘),这意味着当您重新打开应用时,您可以从用户默认值中获取它并继续更改当前计数

【讨论】:

    【解决方案4】:

    声明这两个 var 并让:

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

    每当您更新计数器时添加这行代码:

    defaults.set(currentCount, forKey: countKey)
    

    要取回您的价值,请使用:

    defaults.integer(forKey: countKey)
    

    【讨论】:

    • 嗨@Marybnq,非常感谢您的帮助!我现在就试试你的解决方案。我是初学者,有很多问题。如有其他问题,我该如何联系您?
    • SO上有即时通讯吗? @Marybnq
    • 不,如果你有电报可以在那里联系我,用户和我这里的一样
    • 我已经下载了但是找不到你。我的伪是@alexisddt,你能找到我吗?
    • 我找到了您,但无法向您发送任何消息。也许另一个解决方案? :) @Marybnq
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多