Bala
Bala

Reputation: 39

How can i call NStimer form one viewcontroller from unother viewcontroller?

At first time i call the timer like this in Third viewcontroller

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(targetMethod) userInfo:nil repeats:NO];

Then timer called the targetMethod

-(void)targetMethod
{
 First * sVC = [[First alloc] initWithNibName:@"First" bundle:[NSBundle mainBundle]];
 [self presentModalViewController:sVC animated:YES];
 [sVC release];
 [timer invalidate];
}

First viewcontroller opened.. In First viewcontroller had one button.In button action i wrote

- (IBAction) Action:(id)sender
{
 [self dismissModalViewControllerAnimated:YES]; 
 Third *BVC=[[Third alloc]init];
    [Bvc TimerStart];       //Timestart is function i start timer in this function..
 //i want to call Third  viewcontroller timer function this place
}

timer started..But view didn't open (first )viewcontroller.......

Please help me......

Upvotes: 1

Views: 2290

Answers (3)

Chan Kai Long
Chan Kai Long

Reputation: 51

In AppDelegate.h

@property int timePassed;

In AppDelegate.m

@synthesize timePassed;

In ViewController.h

@property (weak, nonatomic)NSTimer *timer;
@property (weak, nonatomic) IBOutlet UILabel *time;

In ViewController.m

- (void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];
AppDelegate *delegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
delegate.timePassed = 180;
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(TimePasses) userInfo:nil repeats:YES];;
}


-(void) TimePasses{
AppDelegate *delegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
delegate.timePassed = delegate.timePassed - 1;
NSLog(@"TimePasses %d", delegate.timePassed);
int minuts = delegate.timePassed / 60;
int seconds = delegate.timePassed - (minuts * 60);

NSString *timerOutput = [NSString stringWithFormat:@"%2d:%.2d", minuts, seconds];
time.text = timerOutput;
}

In SecondViewController.h

@property (weak, nonatomic)NSTimer *timer;
@property (weak, nonatomic) IBOutlet UILabel *time;

In SecondViewController.m

- (void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(TimePasses) userInfo:nil repeats:YES];;
}

-(void) TimePasses{
AppDelegate *delegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
NSLog(@"TimePasses in 2 %d", delegate.timePassed);
int minuts = delegate.timePassed / 60;
int seconds = delegate.timePassed - (minuts * 60);

NSString *timerOutput = [NSString stringWithFormat:@"%2d:%.2d", minuts, seconds];
time.text = timerOutput;
}

Upvotes: 0

Ilker Baltaci
Ilker Baltaci

Reputation: 11787

What if if i need to have a count down timer which should be shared among the view controllers.do i have to make it in the app delegate where the remaining seconds could be an ivar also in app delegate with property? In this case i would post notification from the timer handler after updating the remaining seconds

Upvotes: 0

iwasrobbed
iwasrobbed

Reputation: 46713

Bala,

Place the NSTimer object in the App Delegate .h file, include that .h file in wherever you use the timer. This will allow the NSTimer to be a global timer which you can call from any other view that includes the app delegate header file.

In app delegate .h file (in the appropriate areas):

NSTimer *delayTimer;

@property (nonatomic, retain) NSTimer *delayTimer;

Synthesize this in the app delegate .m file (remember to release it in dealloc):

@synthesize delayTimer;

Then in whichever views you use the timer in, access it like this:

// get global variable
SomeNameHereAppDelegate *mainDelegate = (SomeNameHereAppDelegate *)[[UIApplication sharedApplication] delegate];    

mainDelegate.delayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(targetMethod) userInfo:nil repeats:NO];

Then when you want to invalidate it from somewhere, you just do this:

[mainDelegate.delayTimer invalidate];
 mainDelegate.delayTimer = nil;

Upvotes: 1

Related Questions