2013-08-20 6 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... 

Invalidate и ноль собственности:

[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; 
    } 
} 
Смежные вопросы