2010-08-18 3 views
31

Эй, я просто делаю пример приложения, и у меня небольшие проблемы. Поэтому у меня есть табличный вид, а затем у меня есть несколько строк, и когда пользователь нажимает на строку, он переводит их в новую Посмотреть. В этом представлении у меня есть кнопка для воспроизведения музыки. Я использую таймер, чтобы увеличить ползунок на основе продолжительности музыки и оставшегося времени.Как остановить 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 

ответ

13

так:

[yourtimername invalidate]; 

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

+2

Приложение не сбой, когда я аннулировал таймер, не созданный. – IgniteCoders

67

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

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

Я собираюсь попробовать это утром, его 2 часа ночи, застрял на этом весь день. Надеемся, ваше решение будет работать. плохо вернуться на этот пост через несколько часов. – cruisx

+21

Кто-то должен сказать ему, что он около 3 лет опаздывает на то, что все возвращается к вам ... В любом случае, исправил мою проблему! –

+0

@JonMattingly lol –

8

Поскольку iCoder заявляет, что это должно быть признано недействительным в представленииWillDisappear.

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

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

} 
1

Хитрость заключается в том, чтобы использовать класс одноплодной, Google myGlobals класс, который в основном используется в качестве одноэлементных Хотя, если у вас хотят использовать NSTimer , то

позволяет сказать, вид 1 которой и зайти и посмотреть 2 является тот, который у вернуться 2.

Таким образом, в случае зрения 2, писать NSTimer недействительным таймера в viewDidLoad (Предполагая, что у вас есть два отдельных класса для обоих представлений s) .Проблема будет возникать, потому что, когда вы идите в режим просмотра 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]; 

ой, а вот 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 
2

Вы можете использовать два различных вещей

[timername invalidate]; 

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

timername = nil; 
+0

Последний не остановит таймер, а первый уже был отправлен в августе 2010 года. –

6

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

в .h

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

в.м

@synthesize yourTimer, repeatingTimer; 

в viewDidLoad

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

    self.repeatingTimer = yourTimer; 

в моем viewDidDisappear

[repeatingTimer invalidate]; 
    repeatingTimer = nil; 

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

0

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

[таймер Invalidate];

Смежные вопросы