NSTimer秒表

时间:2012-02-12 23:01:51

标签: xcode xcode4.2 nstimer

我的秒表在我的应用程序上正常运行但是当我点击后退按钮转到另一个视图时它会停止。我希望即使用户正在查看另一页,秒表也会继续运行。

我如何做到这一点?

确定添加了代码

代码:

.h

UILabel *stopWatchLabel;

NSTimer *stopWatchTimer; // Store the timer that fires after a certain time
NSDate *startDate; // Stores the date of the click on the start button

@property (nonatomic, retain) IBOutlet UILabel *stopWatchLabel;

- (IBAction)onStartPressed:(id)sender;
- (IBAction)onStopPressed:(id)sender;

.m

- (void)viewDidUnload
{
[self setStopWatchLabel:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (void)updateTimer
{
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString=[dateFormatter stringFromDate:timerDate];
stopWatchLabel.text = timeString;
}

- (IBAction)onStartPressed:(id)sender {
startDate = [NSDate date];

// Create the stop watch timer that fires every 10 ms
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                  target:self
                                                selector:@selector(updateTimer)
                                                userInfo:nil
                                                 repeats:YES];
}

- (IBAction)onStopPressed:(id)sender {
[stopWatchTimer invalidate];
stopWatchTimer = nil;
[self updateTimer]; 
}

5 个答案:

答案 0 :(得分:1)

好吧它会停止,因为当你从堆栈中弹出它时,它会释放它所存在的视图。 你有没有试过制作一个独立于视图处理计时器的秒表类?

答案 1 :(得分:0)

秒表停止,因为您正在释放控制它的视图。

您需要确保NSTimer未与任何视图相关联。 也许您可以使用子视图或模态视图控制器(我认为可能有效),以便在视图出现时不会释放秒表。

你也可以尝试通过变量将秒表信息发送到下一个视图,然后让另一个视图从那里接管秒表。

其他方法也很多。

无论哪种方式,您都需要确保NSTimer未发布。

答案 2 :(得分:0)

确切地说,如果你看看你的“ViewDidUnload”,当你发布视图时你会将它设置为nil,当你转到另一个视图时它会发生。

你可以尝试的是让一个正在运行计时器的类并将其发送到视图,即使显示它的视图不在内存中,它也仍在运行。

MVC风格!

答案 3 :(得分:0)

是的,其他人都在说什么。 在ViewDidUnload上它正在释放它。这意味着一旦ViewController退出,它基本上就结束了操作。

答案 4 :(得分:0)

我不知道问题是否已经解决但仍然存在。 在App Delegate Class中创建NSTimer的Object,然后以这种方式实例化app委托的.m文件的计时器,你的NSTimer将保留在内存中。当您想要停止或暂停计时器时,您可以从任何视图控制器中使该对象无效。