2012-12-12 55 views
0

問題是停止的NSTimer,出於某種原因[計時器失效]只是不工作...不能作廢,停止倒計時的NSTimer - 目標C

也許我的眼睛充滿了肥皂,但無法理解之所以計時器並沒有停止在0,但去扭轉計數-1,-2,-3等等...(((

我使用的是劃時代的數字作爲目標日期。還有一件事 - 我的按鈕「IBAction停止」與[定時器無效]工作得很好 - 當我推它在模擬器計時器停止時...

@implementation ViewController 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 


Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES]; 

} 

- (IBAction) start { 

Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES]; 


} 
- (IBAction) stop { 

[Timer invalidate]; 
Timer = nil; 

} 

-(void)updateLabel { 

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
int units = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 
NSDateComponents *components = [calender components:units fromDate:[NSDate date] toDate:destinationDate options:0]; 
[dateLabel setText:[NSString stringWithFormat:@"%d%c %d%c %d%c %d%c", [components day], 'd', [components hour], 'h', [components minute], 'm', [components second], 's']]; 

destinationDate = [NSDate dateWithTimeIntervalSince1970:1355299710]; 

if (!destinationDate) { 

    [Timer invalidate]; 
    Timer = nil; 
} 
} 
+0

如果(destinationDate!){ - >始終是正確的,因爲如果變量被實例化,只檢查,所以如果從未失效計時器那裏。也就是你永遠不會進入你的inst inside的內心。你應該重做你的ifstatement並且會很好。 –

+0

好吧,我覺得有一些與if語句,但我嘗試了很多方法 - 不只是目的地的日期,但「dateLabel.text <= 0」仍然沒有好... –

+0

dateLabel.text是一個NSString和你不能比較到一個像0這樣的int。在這種情況下,您將不得不添加dateLabel.text.lenght。你的ifstatements不完整。 –

回答

0

Totumus指出的那樣,你if語句條件!destinationDate總是計算爲false,那麼你updateLabel方法永遠不會失效的計時器。

你有太多另一個bug:

你在viewDidLoad創建一個計時器並在Timer實例變量存儲對它的引用。

然後你在start創建另一計時器,並在您Timer實例變量保存一個對它的引用,覆蓋引用您在viewDidLoad創建,同時又不會使舊的計時器計時。

所以,現在你必須運行兩個定時器,但你不必老計時器的引用,所以你永遠不能使它無效。

注意,運行循環具有很強的參考,以預定(運行)的定時器,所以即使你刪除所有你把它強引用的,定時器保持運行。這就是爲什麼invalidate消息存在:告訴運行循環去除到定時其強大的參考。

+0

他沒有說他按下了按鈕。他的停止按鈕也能正常工作,這意味着失效不成問題。計時器 –

+0

@TotumusMaximus也不是真的,但啓動方法是危險的,那麼:D我總是在刷新它之前調用[timer invalidate],我認爲他應該 –

+0

@TotumusMaximus你的觀點是有效的。但是,除非有代碼阻止在有定時器運行時調用它,否則「啓動」操作會被中斷。 –