如何保存计时器实例

问题描述 投票:-1回答:2

我有一个视图控制器(TimerVC),在其中运行计时器,并在标签中显示计时器的当前状态。

我的计时器功能:

func runTimer() {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}

[当TimerVC打开时,用户点击导航栏上的“后退”按钮(步骤1),当用户再次点击按钮以显示TimerVC(步骤2)时,我可以在控制台中看到计时器仍在运行背景,但标签中的状态未更新。

我想这是因为当用户按下“返回”按钮时,TimerVC的当前实例被破坏,并且当用户再次打开TimerVC时,它将创建一个新的TimerVC实例,因此标签无法更新。

我不知道当用户点击导航栏中的后退按钮时如何保存我的TimerVC实例,当用户触发对TimerVC的选择时如何恢复该旧的TimerVC实例。

为了在第2步解决此问题,我尝试返回导航堆栈,而不是为TimerVC创建新的推送序列,但是它没有用,可能是因为在堆栈中找不到旧的TimerVC视图控制器,因此无法还原。这不足为奇,当点击后退按钮时,它应该已经被破坏了。

我应该怎么解决这个问题?

ios swift uinavigationcontroller viewcontroller back-button
2个回答
1
投票

在TimerVC之前具有属性的视图控制器中>

 var timerVC = TimerVC()

当您需要显示它时,只需按下它

self.navigationController.pushViewController(self.timerVC, animated:true)

这样,您将始终处理TimerVC的相同实例>

这里是Timer.scheduledTimer将创建一个单例实例,即使您对vc进行了取消初始化,该实例也不会被杀死。

您可能想做的是在另一个类中创建计时器,例如TimerManager之类的东西。

此类将维护计时器的状态以及其他此类信息。

现在打开TimerVC时,将从TimerManager类中检查是否正在运行计时器。

[记住保留此TimerManager singleton。因此,TimerManager的实例未取消初始化。

如果计时器正在运行,您将从该TimerManager类中获取计时器值等,否则,您将在该TimerManager类中创建一个新计时器。

这也将帮助您在完成工作后使计时器无效。而且,如果您有不同的流程和大量的视图控制器推/弹出按钮,然后回到TimerVC,您仍然可以访问此值。


1
投票

这里是Timer.scheduledTimer将创建一个单例实例,即使您对vc进行了取消初始化,该实例也不会被杀死。

© www.soinside.com 2019 - 2024. All rights reserved.