2013-08-20 81 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; 
    } 
}