Clean way to force view to load subviews early

I agree that forcing a view to load should be avoided but I ran into a case where it seemed the only reasonable solution to a problem (popping a UINavigationController containing a UISearchController that had yet to be invoked causes a nasty console says warning).

What I did was use new iOS9 API loadViewIfNeeded and for pre-iOS9 used viewController.view.alpha = 1.0. Of course a good comment above this code will prevent you (or someone else) removing this code later thinking it is unneeded.

The fact that Apple is now providing this API signals it can be needed from time to time.


On iOS 9 or newer, one can use:

viewController.loadViewIfNeeded()

Docs: https://developer.apple.com/reference/uikit/uiviewcontroller/1621446-loadviewifneeded


merged Rudolph/Swany answers for pre ios9 deployment targets

    if #available(iOS 9.0, *) {
        loadViewIfNeeded()
    }
    else {
        // _ = self.view works but some Swift compiler genius could optimize what seems like a noop out
        // hence this perversion from this recipe http://stackoverflow.com/questions/17279604/clean-way-to-force-view-to-load-subviews-early
        view.alpha = 1
    }

Not sure how much cleaner this way, but it still works fine:

_ = vc.view

UPD: for your convenience, you can declare extension like below:

extension UIViewController {
    func preloadView() {
        let _ = view
    }
}

You can read explaination by following URL: https://www.natashatherobot.com/ios-testing-view-controllers-swift/