2012-02-12 71 views
-1

我有一個秒錶,可以在我的應用程序上正常運行,但是當我點擊後退按鈕轉到另一個視圖時停止。即使用戶正在查看其他頁面,我也希望秒錶能夠繼續運行。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]; 
} 
+1

哪個對象擁有NSTimer? – bneely 2012-02-12 23:07:02

回答

1

那麼它停止,因爲你釋放它生活在視圖當你將它從堆棧中彈出時。 你有沒有嘗試過讓秒錶類處理獨立於視圖的定時器?

0

秒錶停止,因爲您正在釋放控制它的視圖。

您需要確保NSTimer未鏈接到任何視圖。 也許你可以使用子視圖或模態視圖控制器(我認爲這可能工作),以便沒有秒錶時發佈秒錶。

您也可以嘗試通過變量將秒錶信息發送到下一個視圖,然後讓另一個視圖從那裏接管秒錶。

還有絕對的其他方法。

無論哪種方式,您都需要確保NSTimer未被釋放。

+0

感謝您的提示 – 2012-02-13 01:07:31

0

沒錯,如果你看看你的「ViewDidUnload」,你將它設置爲零,當視圖被釋放時,它會在你轉到另一個視圖時執行。

你可以嘗試的一件事就是讓一個運行計時器的類將其發送到視圖,即使顯示它的視圖不在內存中,它仍然運行。

MVC風格!

0

是的,其他人都說。 在ViewDidUnload上釋放它。這意味着它基本上是在該ViewController退出時立即結束操作。

+0

好吧,當我去從viewDidUnload刪除它,我收到了很多錯誤。如果你有任何我應該做的代碼。我很感激。謝謝 – 2012-02-13 13:30:09

0

我不知道問題是否已經解決,但仍然。 在App Delegate Class中創建NSTimer對象,然後以這種方式實例化應用程序委託的.m文件中的計時器,您的NSTimer將保留在內存中。當你想停止或暫停計時器時,你可以使任何視圖控制器中的對象失效。