我的应用程序中有 2 个 View Controller ,从第一个 View 导航到下一个 View 时,有一个名为 startTimer 的按钮,在单击 startTimer 时将计时器操作作为选择器方法,计时器以 HH:mm:ss 启动 格式,我没有使计时器无效,但是当我回到第一个 viewController 时,如果我再次回到第二个 viewController,如果我按下 startTimer 按钮,计时器再次从 0 开始,但我希望它被保留以前的值(value),我怎样才能做到这一点?我知道,因为我再次加载 viewController,nib 将被重新加载到内存中,但是我如何保留计时器标签和计时器值? 提前感谢任何帮助。谢谢。
最佳答案
您通过将数据放入 View Controller 破坏了 MVC(模型- View - Controller )。此外,您要求一种对时间没有可靠 promise 的机制 (NSTimer
) 来为您跟踪时间。 NSTimer
不会在您请求的时间间隔内准确地 触发。它可以在该时间间隔后的任意点触发。 将 (最后一点被夸大了。重复计时器正确安排自己,所以通常不会浪费时间。如果重复被完全跳过,你只会浪费时间,这可能发生在长滚动或其他可以使计时器保持一整秒的事情中。)NSTimer
用作秒表几乎总是会浪费时间(有时会浪费很多时间,尤其是在周围有 ScrollView 的情况下)。
创建一个新的模型对象来保存秒表信息。我们称它为 Stopwatch
。假设您需要它是可启动和可停止的,它需要一个 NSTimeInterval accumulatedTime
属性和一个 NSDate lastStarted
属性(您也可以将 lastStarted
设为 NSTimeInterval
如果你喜欢)。因此,要启动秒表,请将 lastStarted
设置为“now”。要停止秒表,请清除 lastStarted
并将当前累计时间移至 accumulatedTime
。要找出当前时间,您可以将 accumulatedTime
添加到 now - lastStarted
。
好的,现在你有了它,你能用它做什么?您可以将它传递给您的 View Controller ,他们可以询问“当前秒表值是多少?”他们可以随心所欲地开始和停止它。
现在你的 View Controller 想要每秒更新它的显示,所以你有一个计时器可以做到这一点。每一秒它都会询问秒表“现在是什么时候”并显示出来。但它不会设置时间。它只是询问。
顺便说一句,您还可以在 Stopwatch
上使用 KVO,但这有点棘手,因为 Stopwatch
需要运行自己的计时器来发送更改通知。我通常觉得这比它的值(value)更麻烦。
关于iphone - 如何让 NSTimer 保持活力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787860/