Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does viewDidAppear in UITabBarController exec before the view appears?

I have a UITabBarController that nests a UIView-Subclass (ImageViewer) as it's third tab.

In this ImageViewer Subclass I call the viewDidAppear method:

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    /* ... start custom code ... 
    NSLog(@"viewDidAppear tag 1 passed);          /* BREAKPOINT 1 here

    [myUIActivityIndicator stopAnimating];

    NSLog(@"viewDidAppear tag 2 passed);          /* BREAKPOINT 2 here
    /* ... end custom code ... 
}

the method is called automatically, but strangely the view only appears after this method has been processed completely?

When I set breakpoints (1 and 2) as indicated, the processing (upon selecting the tab) stops whilst the previous tab is still showing. Only when clicking continue after the second breakpoint, the view will be displayed. (FYI the NSLogs are carried out immeldiately).

In this case viewDidAppear behaves more like viewWillAppear ....

Any clues what might be going on?

Cheers


1 Answers

If you want to allow the screen to be re-drawn when your view loads, but to trigger some other updating code in -viewDidAppear:, use performSelector:withObject:afterDelay: like this:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self performSelector:@selector(updateUI) withObject:nil afterDelay:0.0];
}

…

- (void)updateUI
{
    // Do your UI stuff here
}

When you do it this way, the current event loop will finish quickly, and UIKit will be able to re-draw the screen after your view has loaded. updateUI will be called in the next event loop. This is a good way to get snappy view transitions if you have to perform computationally intensive calculations or updates after a view has loaded.

like image 75
Nick Forge Avatar answered Dec 20 '25 22:12

Nick Forge



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!