Как остановить NSTimer

Эй, я просто делаю пример приложения, и у меня небольшие проблемы. Итак, у меня есть табличное представление, а затем у меня есть несколько строк, и когда пользователь щелкает строку, он переносит их в новый взгляд. На этом представлении у меня есть кнопка для воспроизведения музыки. Я использую таймер, чтобы увеличить ползунок в зависимости от продолжительности музыки и оставшегося времени.

Теперь моя проблема в том, что мне нужно сделать, чтобы при возвращении к табличному представлению с помощью верхней левой кнопки NSTimer останавливался?

Это то, что у меня есть до сих пор, я не могу получить повтор: ДА, таймер для остановки.

#import "SecondViewController.h"

@implementation SecondViewController
@synthesize lbl1;
@synthesize timer;

-(IBAction) slide {
 myMusic.currentTime = slider.value;
}

-(IBAction)play
{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
 slider.maximumValue = [myMusic duration];
 myMusic.volume = 0.2;
 [myMusic prepareToPlay];
 [myMusic play];
}

-(IBAction)pause
{
 [myMusic pause];
}

-(IBAction)stop
{
 slider.value = 0;
 myMusic.currentTime = 0;
 [myMusic stop];
}

- (void)updateTime{
  slider.value = myMusic.currentTime;
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

  //This plays music, we must give it a path to find the file and then u can change it. 
 NSString * pathToMusicFile = [[NSBundle mainBundle] pathForResource:@"Katy" ofType:@"mp3"];
     myMusic = [[ AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile] error:NULL];
     myMusic.delegate = self;
     myMusic.numberOfLoops = -1;

 slider.value = 0;
 //[myMusic play];

    [super viewDidLoad];
}


- (void)viewDidUnload {

 [timer invalidate];
 timer = nil;
 //myMusic.currentTime = 0;
 [myMusic stop];
 [super viewDidUnload];

 // Release any retained subviews of the main view.
 // e.g. self.myOutlet = nil;
}

-(IBAction) TxtChange;{

 lbl1.text = @" test2! I CHNAGED TEXT FROM ANOTHER XIB";
}

- (void)dealloc {
 [timer invalidate];
 timer = nil; 
 [myMusic release];
    [super dealloc];
}

@end
32
задан Cœur 15 March 2017 в 15:07
поделиться

2 ответа

вот так:

[yourtimername invalidate];

Но будьте осторожны, вы не можете остановить таймер, если он уже остановлен, потому что ваше приложение выйдет из строя.

13
ответ дан 27 November 2019 в 19:57
поделиться

Используйте приведенный ниже код. Он будет работать Но имейте в виду, что он должен вызываться только если наш таймер находится в работающем режиме, иначе приложение будет разбито.

- (void)viewWillDisappear:(BOOL)animated {
    //BEFORE DOING SO CHECK THAT TIMER MUST NOT BE ALREADY INVALIDATED
    //Always nil your timer after invalidating so that 
    //it does not cause crash due to duplicate invalidate
       if(timer)
       {
         [timer invalidate];
         timer = nil;
       }
    [super viewWillDisappear:animated];
}
67
ответ дан 27 November 2019 в 19:57
поделиться