如何保留 Timer 实例
How to preserve a Timer instance
我有一个视图控制器 (TimerVC),其中我 运行 一个计时器,我在标签中显示计时器的当前状态。
我的定时器功能:
func runTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}
当 TimerVC 打开时用户点击导航栏上的 "Back" 按钮(第 1 步),当用户再次点击按钮显示 TimerVC 时(第 2 步),我可以在控制台中看到计时器仍在后台 运行ning,但其状态未在标签中更新。
我猜这是因为当用户按下"Back"按钮时TimerVC的当前实例被销毁,当用户再次打开TimerVC时,它创建了一个新的TimerVC实例,因此无法更新标签。
我不知道如何在用户点击导航栏中的后退按钮时保留我的 TimerVC 实例,并在用户触发到 TimerVC 的 segue 时恢复旧的 TimerVC 实例。
为了在第 2 步解决这个问题,我尝试返回导航堆栈而不是创建一个新的推送到 TimerVC 的转场,但是它没有用,可能是因为在中找不到旧的 TimerVC 视图控制器堆栈,因此无法恢复。这并不奇怪,它应该在点击后退按钮时被破坏了。
我应该怎么做才能解决这个问题?
在 TimerVC 之前的视图控制器中有一个 属性
var timerVC = TimerVC()
需要显示的时候推一下
self.navigationController.pushViewController(self.timerVC, animated:true)
这样您将始终处理 TimerVC
的相同实例
这里的事情是 Timer.scheduledTimer 将创建一个单例实例,它不会被杀死,即使你 vc 被取消初始化。
您可能想要做的是在不同的 class 中创建计时器,例如 TimerManager
或其他。
这 class 将维护计时器的状态和其他此类信息。
现在当您打开您的 TimerVC 时,您将从您的 TimerManager class 检查是否有定时器 运行。
记得保留这个TimerManager
singleton
。所以 TimerManager
的实例没有被取消初始化。
如果计时器是 运行,您从 TimerManager class 获取计时器值等,否则您在 TimerManager class 中创建一个新计时器。
这也将帮助您在工作完成后使计时器失效。如果你有不同的流程和很多 push/pops 视图控制器,然后你回到你的 TimerVC,你仍然可以访问这个值。
我有一个视图控制器 (TimerVC),其中我 运行 一个计时器,我在标签中显示计时器的当前状态。
我的定时器功能:
func runTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}
当 TimerVC 打开时用户点击导航栏上的 "Back" 按钮(第 1 步),当用户再次点击按钮显示 TimerVC 时(第 2 步),我可以在控制台中看到计时器仍在后台 运行ning,但其状态未在标签中更新。
我猜这是因为当用户按下"Back"按钮时TimerVC的当前实例被销毁,当用户再次打开TimerVC时,它创建了一个新的TimerVC实例,因此无法更新标签。
我不知道如何在用户点击导航栏中的后退按钮时保留我的 TimerVC 实例,并在用户触发到 TimerVC 的 segue 时恢复旧的 TimerVC 实例。
为了在第 2 步解决这个问题,我尝试返回导航堆栈而不是创建一个新的推送到 TimerVC 的转场,但是它没有用,可能是因为在中找不到旧的 TimerVC 视图控制器堆栈,因此无法恢复。这并不奇怪,它应该在点击后退按钮时被破坏了。
我应该怎么做才能解决这个问题?
在 TimerVC 之前的视图控制器中有一个 属性
var timerVC = TimerVC()
需要显示的时候推一下
self.navigationController.pushViewController(self.timerVC, animated:true)
这样您将始终处理 TimerVC
这里的事情是 Timer.scheduledTimer 将创建一个单例实例,它不会被杀死,即使你 vc 被取消初始化。
您可能想要做的是在不同的 class 中创建计时器,例如 TimerManager
或其他。
这 class 将维护计时器的状态和其他此类信息。
现在当您打开您的 TimerVC 时,您将从您的 TimerManager class 检查是否有定时器 运行。
记得保留这个TimerManager
singleton
。所以 TimerManager
的实例没有被取消初始化。
如果计时器是 运行,您从 TimerManager class 获取计时器值等,否则您在 TimerManager class 中创建一个新计时器。
这也将帮助您在工作完成后使计时器失效。如果你有不同的流程和很多 push/pops 视图控制器,然后你回到你的 TimerVC,你仍然可以访问这个值。