2012-03-20 103 views
0

我有2个viewControllers在我的应用程序,从第一个视图,当我导航到下一个有一个名为startTimer的按钮与一个定时器动作作为选择器方法点击startTimer计时器启动HH:mm:ss格式,我不是无效的计时器,但当我回到第一viewController和再次如果我再次来到第二viewController,如果我按下startTimer按钮计时器再次从0开始,但我希望它保留以前的值,我怎么能做到这一点?我知道,因为我再次加载viewController的笔尖将被加载到内存,但我怎么能保留计时器的标签和计时器的价值? 任何帮助提前感谢,谢谢。如何保持NSTimer活着?

回答

0

不要这样做,这种方式每次加载包含NSTimer的视图时,都会创建一个新的NSTimer对象,而旧的对象仍在内存中,因为您没有使其失效。

最好的方法是,您必须将NSTimer放入应用程序委托中,然后仅在第一次加载该View Controller时才启动它。

为了实现这一点,您必须添加一个标志来检查视图是否第一次加载。

0

如果NSTimer是你的实例变量之一,我想你可以做一个检查,看看它是否被分配。


//NSTimer *timer; declare this in your interface 

if (timer==nil) 
{ 
    // allocate timer 
} 
//Do nothing if it is allocated all ready 

3

您已经通过将数据放入视图控制器来打破MVC(模型 - 视图 - 控制器)。而且,你所要求的机制没有关于时间的坚定承诺(NSTimer)来跟踪你的时间。 NSTimer不会在请求的时间间隔内触发恰好为。它可以在该时间间隔之后的任意点触发。 使用 NSTimer作为秒表几乎总是会失去时间(有时相当长时间,特别是如果有滚动视图时)。 (最后一点被夸大了,一个重复的计时器正确地调度自己,所以通常不会浪费时间,如果重复被完全跳过,在长时间滚动或其他可以保持定时器触发的事件中, )

创建一个新的模型对象来保存秒表信息。我们称之为Stopwatch。假设你需要它可以启动和停止,它需要一个NSTimeInterval accumulatedTime属性和一个NSDate lastStarted属性(如果你愿意,你也可以使lastStarted为)。因此,要启动秒表,请将lastStarted设置为“now”。要停止秒表,请清除lastStarted并将当前累计时间移至accumulatedTime。要查看当前时间,请将accumulatedTime添加到now - lastStarted

好的,现在你已经有了,你可以用它做什么?您可以将它传递给您的视图控制器,他们可以询问“当前秒表值是多少?”他们可以随意启动和停止它。

现在你的视图控制器想要每秒更新它的显示,所以你有一个计时器来做到这一点。它每秒钟都会询问秒表“当前时间是什么”,并显示它。但它没有设置的时间。它只是问。

顺便说一下,你也可以在Stopwatch上使用KVO,但它有点棘手,因为Stopwatch需要运行自己的计时器来发送更改通知。我通常觉得比它的价值更麻烦。

0

我会做的是将第二个视图控制器作为您的第一个视图控制器的ivar。这样,您可以仅实例化一次,并且您的NSTimer将保留在内存中。但是,如果你想保持你的风格,你应该保存当前时间的任何一种喜好(看[NSUserDefaults standardUserDefaults]或创建你自己的单身人士课程)。然后在视图中从你的第二个视图控制器加载方法,加载该值并将其添加为您的定时器的偏移量。

希望能帮到你!