UILabel text not being updated
You may be facing an issue with threading as mentioned in the comments above. If you have a method that runs on the main thread and does some activity (such as search a database), updates that you make to the UI will not be committed until the run loop gets control. So, if you have a long, time consuming task going on on the main thread, run this code after setting the text of the label:
- (void)doSomethingTimeConsuming ... consume some time ... ... set text of label ... [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; ... continue long operation ...}
This should flush out any UI changes that you have made. Although this may be a sensible and functional hack, it doesn't beat the alternative. I highly suggest that you perform your app's time consuming tasks on a background thread, and update the UI through the main thread using performSelectorOnMainThread:withObject:waitUntilDone:
. See Apple's page on iOS Thread Management.
In my case the function that was updating was called from a touch recognizer on a thread, but the place in the function where I'm changing the value of the label's text property I put it back on the main thread:
dispatch_async(dispatch_get_main_queue(), ^{ [self.someLabel setText:someString];});
I had a UILabel showing a level number that would not update to the new level number on a UIViewController. The only viable solution I could find that worked was to call setNeedsDisplay on the main thread of the view controller that owned the UILabel
-(void)changeLevelLabel:(int)theLevel {dispatch_async(dispatch_get_main_queue(), ^{ self.levelLabel.text = [NSString stringWithFormat:@"%d",theLevel]; [self.levelLabel setNeedsDisplay];});
}
See http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/ for a more detailed explanation