Подтвердить что ты не робот

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

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

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

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

#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
4b9b3361

Ответ 1

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

- (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];
}

Ответ 2

вот так:

[yourtimername invalidate];

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

Ответ 3

Поскольку iCoder говорит, что он должен быть недействительным в viewWillDisappear.

Я добавил следующее, чтобы убедиться. меня устраивает. Надеюсь, что это поможет (и добавляет, что ответы на идентификаторы не намерены копировать)

- (void) startTimer
{
[self stopTimer];
timer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                                     target: self
                                                   selector:@selector(onTick)
                                                   userInfo: nil repeats:YES];

}

- (void) stopTimer
{
    if (timer) {
        [timer invalidate];
        timer = nil;
    }

}

Ответ 4

4-летняя почта, я знаю, но, может быть, я смогу спасти NEXT парня от потери времени, пытаясь сделать недействительным NSTimer. Документация яблок объясняет это, и это работает для меня.

в .h

@property(nonatomic, retain) NSTimer *yourTimer;
@property(weak) NSTimer *repeatingTimer;

в .m

@synthesize yourTimer, repeatingTimer;

in viewDidLoad

yourTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimerInterval)(40.0/60.0)
                                             target:self
                                           selector:@selector(blink)
                                           userInfo:nil
                                            repeats:TRUE];

  self.repeatingTimer = yourTimer;

в моем представленииDidDisappear

   [repeatingTimer invalidate];
   repeatingTimer = nil;

трюк заключается в назначении первого объекта NSTimer (слабому) NStimer и уничтожении этого объекта.

Ответ 5

Вы могли бы использовать две разные вещи

    [timername invalidate];

Или вы могли бы использовать

    timername = nil;

Ответ 6

Trick - использовать одноэлементный класс, класс google myGlobals, который в основном используется как одноэлементный Хотя если вы хотите использовать NSTimer, то

позволяет сказать, что вид 1 - это то, что u входит в и просматривает 2, это тот, который u возвращается назад.

Итак, в случае представления 2 напишите NSTimer, чтобы сделать недействительным таймер в viewDidLoad (предположим, что у вас есть два отдельных класса для обоих представлений). Проблема возникает, потому что, когда вы идите на просмотр 1, вид 2 Таймеры будут освобождены. Итак, создайте класс Singleton и сохраните указатель NSTimer, подобный этому

//to be done in viewDidLoad function
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
[globals.myTimer invalidate];


//to be done in viewDidUnload
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
globals.myTimer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                                 target: self
                                               selector:@selector(onTick)
                                               userInfo: nil repeats:YES];

oh, и вот код класса myGlobals, который вам понадобится

//theglobals.h file

#import <Foundation/Foundation.h>


@interface theGlobals : NSObject 
{
    NSTimer *myTimer;
}

@property (nonatomic, copy) NSString *changeyes;



+(theGlobals*)sharedInstance;
@end

//implementaton .m file

#import "theGlobals.h"
@implementation theGlobals

@synthesize myTimer;



static theGlobals *sharedInstance;

- (id) init
{
return self;
}

+(theGlobals*)sharedInstance
{
if (!sharedInstance)
{
    sharedInstance = [[theGlobals alloc] init];
}
return sharedInstance;
}
@end

Ответ 7

Просто отмените таймер

[таймер недействителен];