Question

I have an application with a Tab Bar Controller and a lot of UIViewController, I defined the interface on storyboard, I want that when the user lunch the application (When application loaded) all ControllerViews are loaded, and not when the user select a tab (My UIViewController are complex and it take little time to load)

Was it helpful?

Solution

The answer you posted is incorrect; You should not call -loadView manually. From the documentation:

Discussion

You should never call this method directly. The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property.

So you should instead simply access the view property. Your modified code would then be:

UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController;
for(int i = 0; i < 5; i++) {
    [[tabBar.tabBarController.viewControllers objectAtIndex:i] view];
}

Also note that this work should probably not take place inside your -application:didFinishLaunchingWithOptions: method, because iOS will terminate your app if this method does not return in 5 seconds. You can schedule this task on the next runloop iteration like this:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self preloadTabs];
}];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top