Hey so i am just making an example application and i am having a little trouble, So i have a table view and then i have a few rows and when a user clicks a row it takes them to a new view. On this view i have a button to play music. I am using a timer to make a slider bar increase based on music duration and remaining time.
Now my problem is, what do i have to put so that when i go back to the table view via the top left button, that the NSTimer stops?
this is what i have so far, i cannot get a repeat: YES timer to stop.
#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
Trick is to use a singleton class, google myGlobals class which is mostly used as a singleton Although if u do wish to use
NSTimer
, thenlets say the view 1 is which u go into and view 2 is the one which u go back 2.
So in case of view 2, write the
NSTimer
to invalidate the timer in theviewDidLoad
(Assuming you have two separate classes for both views).Problem will occur because when u go to view 1, the view 2 Timers will be dealloc. So, make a Singleton class and save theNSTimer
pointer like thisoh , and here is the myGlobals class code that u will need
As iCoder says it has to be invalidated in viewWillDisappear.
I added the following just to make sure. it works for me. Hope it helps (and adds to icoders answer do not intent to copy)
4 year old post, I know but maybe I can save the NEXT guy from wasting time trying invalidate a NSTimer. Apples documentation explains it and it works for me.
in .h
in .m
in viewDidLoad
in my viewDidDisappear
the trick is in the assignment of the first NSTimer to (weak) NStimer object and killing THAT object.
You Could Use Two Different Things
Or You Could Use
like this:
But be careful, you cant stop the timer if it's already stopped because your app will crash.
Use the below code. It will work But keep in mind that it must only be called if our timer is in running mode else the application will get crashed.