这里是Timer.scheduledTimer将创建一个单例实例,即使您对vc进行了取消初始化,该实例也不会被杀死。
我有一个视图控制器(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视图控制器,因此无法还原。这不足为奇,当点击后退按钮时,它应该已经被破坏了。
我应该怎么解决这个问题?
在TimerVC之前具有属性的视图控制器中>
var timerVC = TimerVC()
当您需要显示它时,只需按下它
self.navigationController.pushViewController(self.timerVC, animated:true)
这样,您将始终处理
TimerVC
的相同实例>
这里是Timer.scheduledTimer将创建一个单例实例,即使您对vc进行了取消初始化,该实例也不会被杀死。
您可能想做的是在另一个类中创建计时器,例如TimerManager
之类的东西。
此类将维护计时器的状态以及其他此类信息。
现在打开TimerVC时,将从TimerManager类中检查是否正在运行计时器。
[记住保留此TimerManager
singleton
。因此,TimerManager
的实例未取消初始化。
如果计时器正在运行,您将从该TimerManager类中获取计时器值等,否则,您将在该TimerManager类中创建一个新计时器。
这也将帮助您在完成工作后使计时器无效。而且,如果您有不同的流程和大量的视图控制器推/弹出按钮,然后回到TimerVC,您仍然可以访问此值。
这里是Timer.scheduledTimer将创建一个单例实例,即使您对vc进行了取消初始化,该实例也不会被杀死。