Nitesh Meshram
Nitesh Meshram

Reputation: 555

UILabel text is not updating NSTimer objective c?

Hi I have Navigation based application in which there is a timer in one view. (View like : A, B & C)

I have timer in C when I start timer it's working fine but when I push back to any view and again come to View C it's not showing updated values.

here is my code .

App Delegate

-(int)updateTimer
{
    timer_value--;
    return timer_value;

}

View "C" Code

- (IBAction)buttonClick:(id)sender {
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES];
} 



 -(void)update
    {

        MFAppDelegate *appDelegate = (MFAppDelegate *) [[UIApplication sharedApplication]delegate];
        int Time=[appDelegate updateTimer];

        int minute=Time/60;
        int second=Time-(minute*60);

        NSString *strValue=[NSString stringWithFormat:@"%d:%d",minute,second];
 NSLog(@"%@",self.lbl_timer.text);
        [self.lbl_timer setText:strValue];
    }

update function is calling every time and NSlog of label text is showing correct.

Anything I am doing wrong ? please help me out.

Upvotes: 1

Views: 1627

Answers (3)

Ahmed Z.
Ahmed Z.

Reputation: 2337

In your class

-(void)update
{

    MFAppDelegate *appDelegate = (MFAppDelegate *) [[UIApplication sharedApplication]delegate];
    int Time=[appDelegate updateTimer];

    int minute=Time/60;
    int second=Time-(minute*60);

    NSString *strValue=[NSString stringWithFormat:@"%d:%d",minute,second];
    NSLog(@"%@",self.lbl_timer.text);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DoUpdateLabel" object:strValue userInfo:nil];

}
- (void) updateLabel:(NSString *)string
{
    yourLabel.text = string;
}

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLabel:) name:@"DoUpdateLabel" object:nil];
}

Upvotes: 2

codencandy
codencandy

Reputation: 1721

you need to tell the UILabel to redraw itself after its text property has changed. I don't know about the method Ahmed Z. describes, but in my projects something like

[[self lbl_timer] setNeedsDisplay];

does the trick.

cheers

Upvotes: 0

Valent Richie
Valent Richie

Reputation: 5226

I think the views you are referring to are actually view controllers. When you go back from a view controller to previous view controller in the navigation controller stack, depending on your code, it will be released if you do not retain it, which I assume happened in your case.

Because of that, everytime you push a new view controller, it is actually a newly allocated instance of the view controller, and it is not the same instance as the previously viewed view controller.

Try to make the view controller, e.g. A, which has the timer label as a strong property of the view controller that push A.

@property (nonatomic, strong) UIViewController *viewControllerA;

And push the property instead of allocating a new instance everytime you push A.

[self.navigationController pushViewController:self.viewControllerA animated:YES];

Upvotes: 1

Related Questions