Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何保存计时器实例_Ios_Swift_Uinavigationcontroller_Viewcontroller_Back Button - Fatal编程技术网

Ios 如何保存计时器实例

Ios 如何保存计时器实例,ios,swift,uinavigationcontroller,viewcontroller,back-button,Ios,Swift,Uinavigationcontroller,Viewcontroller,Back Button,我有一个视图控制器(TimerVC),在其中我运行一个计时器,并在标签中显示计时器的当前状态 我的计时器功能: func runTimer() { timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true) } 当TimerVC打开时,用户点击导航栏上的“后退”按钮(步骤1),当用户点击按钮再次显

我有一个视图控制器(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已取消初始化,它也不会被终止

您可能想做的是在不同的类中创建计时器,比如
timermager
之类的

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

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

请记住保留此
timermager
singleton
。因此,
timermager
的实例没有被反初始化

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


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

这是可行的,但如果用户在TimerVC之前的视图控制器中再次单击back按钮,则属性将被破坏,因此我无法再次访问同一TimerVC实例。解决这个问题的最佳实践是什么?当应用程序启动时,我是否应该在AppDelegate中创建一个属性并在其他视图控制器中引用它?@Teo创建一个单例类并在该单例类中运行计时器是最佳做法。如果你想保留计数器值并在关闭并重新启动应用程序后恢复计时器,在singleton类中使用userdefaults,那么我认为最好使用一个封装计时器的单一模型对象。然后,每次需要时都可以创建一个新的TimerVC,因为TimerVC的每个新实例都将处理同一个模型对象。您可以(而且很可能应该)将模型对象设置为单音