2013-08-20 79 views
-1

對不起,這是一個重複的問題,但我嘗試了所有我找不到的解決方案。NSTimer未能停止?

無論如何,這是我的問題,具體而言。我有以下代碼,在長按手勢時啓動計時器,然後在取消手勢或動作完成時停止計時。

-(void)photoLongPress:(UILongPressGestureRecognizer *)press 
{ 
    NSTimer *timer = nil; 

    if (press.state == UIGestureRecognizerStateBegan) 
    { 
     //Start timer 
     timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(photoLongPressTimer:) userInfo:nil repeats:YES]; 
    } 
    if (press.state == UIGestureRecognizerStateEnded) 
    { 
     [timer invalidate]; 
     timer = nil; 
    } 
} 

-(void)photoLongPressTimer:(NSTimer *)timer 
{ 
    DAProgressOverlayView *progress = (DAProgressOverlayView *)[self.view viewWithTag:kTagPhotoDeleteProgressIndicator]; 

    progress.progress += 0.08; 

    if (progress.progress == 1) 
    { 
     [self deletePhotoSelection]; 
     [timer invalidate]; 
     timer = nil; 
    } 
} 

定時器在photoLongPressTimer方法無效時,但如果所述手勢在photoLongPress方法停止停止。爲什麼會這樣呢?我很難過。

謝謝。

回答

3

您需要將timer存儲在實例變量中,以便稍後參考。它在photoLongPressTimer:工作,因爲定時器作爲參數傳遞,但在photoLongPress:它是零,因爲你還沒有創建它,它是一個本地參考。

添加一個屬性:

@property (strong, nonatomic) NSTimer *timer; 

商店新的計時器到它:

self.timer = [NSTimer schedu... 

廢止和無屬性:

[self.timer invalidate]; 
self.timer = nil; 
+0

使用代碼這個偉大的工程。我很好奇,爲什麼當一個局部變量(第一次出現的葉子)似乎是對原始對象的引用時不工作? –

+1

您在最初創建計時器時有參考,但每次手勢改變時,再次調用該方法時會創建一個新的本地參考(並設置爲零)。 – Wain

1

問題是NSTimer *timer = nil;-(void)photoLongPress:(UILongPressGestureRecognizer *)press 方法。

從此方法中刪除NSTimer *timer = nil;並存儲NSTimer的實例。

+0

將有助於詳細說明存儲實例的方式,因爲技術上海報正在存儲實例,雖然暫時存在。 – Jeremy

2
NSTimer *timer = nil; 

此行僅創建局部變量。 您必須爲計時器創建一個屬性。 將其放入您的.h文件中。

@property (strong) NSTimer *timer; 

然後在這裏

-(void)photoLongPress:(UILongPressGestureRecognizer *)press 
{  
    if (press.state == UIGestureRecognizerStateBegan) 
    { 
     //Start timer 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(photoLongPressTimer:) userInfo:nil repeats:YES]; 
    } 
    if (press.state == UIGestureRecognizerStateEnded) 
    { 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 
} 

-(void)photoLongPressTimer:(NSTimer *)timer 
{ 
    DAProgressOverlayView *progress = (DAProgressOverlayView *)[self.view viewWithTag:kTagPhotoDeleteProgressIndicator]; 

    progress.progress += 0.08; 

    if (progress.progress == 1) 
    { 
     [self deletePhotoSelection]; 
     [timer invalidate]; 
     timer = nil; 
    } 
}