我的应用程序中有2个viewControllers,从第一个视图导航到下一个时,有一个名为startTimer的按钮,其中有一个计时器操作作为选择器方法点击startTimer,计时器在 HH:mm:ss中启动格式,我不是使计时器无效,但当我回到第一个viewController并再次如果我再次来到第二个viewController并且如果我按下startTimer按钮,计时器再次从0开始,但我希望它保留以前的价值,我怎么能实现这个目标?我知道,因为我再次加载viewController,nib将被新加载到内存中,但我如何保留计时器标签和计时器值? 任何帮助都会提前感谢。谢谢。
答案 0 :(得分:3)
通过将数据放入视图控制器,您已经破坏了MVC(模型 - 视图 - 控制器)。此外,你要求的机制没有时间(NSTimer
)的坚定承诺来跟踪你的时间。 NSTimer
不会在您请求的时间间隔内完全 。它可以在该间隔之后的任意点发射。 使用(最后一点被夸大了。重复计时器正确安排自己所以通常不会浪费时间。如果重复被完全跳过,你就会失去时间,这可能发生在长卷轴或其他可以让计时器停止射击一整秒的事情中。)NSTimer
作为秒表几乎总会浪费时间(有时会花很多时间,特别是如果周围有滚动视图)。
创建一个新的模型对象来保存秒表信息。我们称之为Stopwatch
。假设您需要它是可开始且可停止的,它需要NSTimeInterval accumulatedTime
属性和NSDate lastStarted
属性(如果您愿意,还可以使lastStarted
成为NSTimeInterval
)。因此,要启动秒表,请将lastStarted
设置为“现在”。要停止秒表,请清除lastStarted
并将当前累计时间移至accumulatedTime
。要查找当前时间,请将accumulatedTime
添加到now - lastStarted
。
好的,既然你拥有它,你能用它做什么?您可以将它传递给视图控制器,他们可以询问“当前的秒表值是多少?”他们可以随心所欲地开始和停止它。
现在你的视图控制器想要每秒更新它的显示,所以你有一个计时器来做到这一点。每秒它都会向秒表询问“当前时间是多少”并显示出来。但它没有设置时间。它只是问。
顺便说一下,您也可以在Stopwatch
上使用KVO,但这有点棘手,因为Stopwatch
需要运行自己的计时器来发送更改通知。我一般认为这比它的价值更麻烦。
答案 1 :(得分:0)
不要这样做,这样每次加载包含NSTimer的视图时,都会创建一个新的NSTimer对象,而旧的NSTimer对象仍然在内存中,因为你没有使它失效。
最好的方法是必须将NSTimer放在Application Delegate中,然后仅在第一次加载View Controller时启动它。
为实现此目的,您必须设置一个标志以检查View是否第一次加载。
答案 2 :(得分:0)
如果NSTimer是您的实例变量之一,我猜您可以检查它是否已分配。
//NSTimer *timer; declare this in your interface
if (timer==nil)
{
// allocate timer
}
//Do nothing if it is allocated all ready
答案 3 :(得分:0)
我要做的是将第二个视图控制器保存为第一个视图控制器的ivar。这样,您只需将其实例化一次,NSTimer就会保留在内存中。
但是,如果要保持自己的风格,则应将当前时间保存在任何类型的首选项中(查看[NSUserDefaults standardUserDefaults]
或创建自己的单例类)。然后在视图中从第二个视图控制器执行加载方法,加载该值并将其添加为计时器的偏移量。
希望能帮到你!