首页 > 解决方案 > 如何保留 Timer 实例

问题描述

我有一个视图控制器(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 的 segue 时恢复旧的 TimerVC 实例。

为了在第 2 步解决这个问题,我尝试返回导航堆栈而不是创建新的推送 segue 到 TimerVC,但它不起作用,可能是因为在堆栈中找不到旧的 TimerVC 视图控制器,所以它无法恢复。这并不奇怪,它应该在点击返回按钮时被破坏。

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

标签: iosswiftuinavigationcontrollerviewcontrollerback-button

解决方案


在 TimerVC 之前的视图控制器中有一个属性

 var timerVC = TimerVC()

当你需要展示它时,只需推动它

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

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


推荐阅读