2013-03-05 57 views
1
self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopProgressView) userInfo:nil repeats:NO]; 

-(void)stopProgressView 
{ 
    if ([self.timerProgress isValid]) { 
     [self.timerProgress invalidate]; 
     self.timerProgress=nil; 
    } 

} 

,並點擊一個按鈕,當我試圖作廢的NSTimer對象如何使NSTimer無效?

-(void)cancelTimer 
{ 
     if ([self.timerProgress isValid]) { 
      [self.timerProgress invalidate]; 
      self.timerProgress=nil; 
     } 
} 

它沒有得到無效。它會在間隔50之後調用一次stopProgressView。 如何解決此問題?

+0

「它在50間隔之後調用一次stopProgressView」 - 我無法理解這個問題。另外,什麼「問題」? – 2013-03-05 06:26:51

+1

你的使用代碼在你的代碼中沒有問題。你的scheduledTimeWithTimeInterval:5秒不是50來測試你的代碼@ H2CO3是正確的 – 2013-03-05 06:27:44

+0

我不明白你想在'stopProgressView'中做什麼,''selector '爲你的定時器:你正在創建一個非循環定時器,當它觸發時(它會觸發的唯一一次),你就無效了。何必?在'cancelTimer'中,很好,但在'stopProgressView'中是不必要的。在回答你的問題,爲什麼'cancelTimer'似乎沒有工作,你是否嘗試過使用該方法的斷點/日誌?你確定它被叫了嗎? (這不是'IBAction',所以我很懷疑。)底線,這是無效的正確方法,所以它不能被調用。 – Rob 2013-03-05 06:55:12

回答

1
- (IBAction)stopTimer { 
    if ([timerProgress isValid]) { 
     [timerProgress invalidate]; 
    } 
} 

不要使用self.timerProgress使用只是timerProgress

+0

我不認爲這是相關的。如果你已經綜合了實例變量,你不需要self,但是如果你已經轉向Objective C 2.0,那麼你不要做綜合,並使用self或者_ 。 – 2014-07-11 09:35:19

0

好像從你發佈什麼它應該工作。這是我在我的應用程序中的方式,它工作正常。

但是,你可以嘗試,使該選一個,需要一個計時器對象,如:

-(void)stopProgressView:(NSTimer *)timer{ 
    //do stuff with timer here 
} 

注意,這也意味着你應該改變@selector(stopProgressView)到@selector(stopProgressView :)。儘管爲了記錄我目前的停止計時器功能只是使用[self.timer invalidate]並且工作正常。

我對調試的另一條建議是使用NSLogs來確保每個方法實際上都被調用,並且當在if子句中調用該方法以確保該方法有效時。

0

創建NSTimer用了NSRunLoop所以你NSTimer沒有開始,添加此代碼後

self.timerProgress = [NSTimer scheduledTimerWithTimeInterval:50.0 
                 target:self 
                selector:@selector(stopProgressView) 
                userInfo:nil 
                repeats:NO]; 

//add 

[[NSRunLoop currentRunLoop] addTimer:_tapTimer 
          forMode:NSDefaultRunLoopMode]; 
+0

該OP提到計時器工作,所以它必須在* a *運行循環上,可能與無效循環不一樣。 – 2014-07-11 09:46:58

1

造成這種情況的最可能的原因是你的計時器安排在不同的運行循環到一個地方,你試試並使其無效。

定時器必須在與調度它們的運行循環相同的線程/ runloop上失效。

可可觸摸不是線程安全的,所以你應該在主線程上運行所有UI相關的活動。如果你在不同的線程上進行GUI工作,它可能會工作,但是你會得到隨機崩潰,並且你也會產生像這樣的計時器問題。

+0

終於,這一定是答案。我有同樣的問題。 – ikrabbe 2015-08-14 07:20:16