I've got a question regarding the two mentioned methods, since in my tests I don´t make clear the order they are called. I thought that, firstly, viewDidLoad
is called when the viewController is loaded for first time (as the name indicates), and inmediately after the init method. Then, I thought that once viewDidLoad
returns, viewWillAppear
is called. If you display another viewController, and then you return to this one, then it should be already loaded and only viewWillAppear
will be called.
However, while developing I make the impression that there is no order when calling viewDidLoad
and viewWillAppear
... I couldn´t find a clear description of this lifecycle in Apple's documentation, how does this actually work?
Thanks!
I ran a trace on when all these calls are made: http://thecodist.com/article/ios_arc_storyboards_and_uiviewcontroller_trace
-viewDidLoad
is called when the controller loads its view, which is not necessarily right after initialization. View controllers don't load their views until they need them, either to display or for any other reason.-viewWillAppear
is called just before the view is displayed. This will be after-viewDidLoad
, but you don't know exactly how long after.-viewWillAppear
is called every time the view is displayed;-viewDidLoad
will only be called a second time if the view is unloaded at some point (such as didReceiveMemoryWarning). These days that's unusual, but it can happen.Or if the viewController is set to
nil
, which can usually happen if a view controller is kicked off the navigation stack, and therefore next time it is brought to the navigation stack it needs to call-viewDidLoad
again.I would like to add to Caleb's answer: Don't confuse the view controller and the view! The name
viewDidLoad
clearly indicates that the method is invoked after the view has been loaded. It is the view controller that does the loading.Some pointers regarding the lifecycle of views and the order in which messages are sent:
UIViewController
's lifecycle overrides.loadView
andviewDidLoad
, also in conjunction with storyboards.viewWillAppear:
et al)I'm stopping here. You can find more stuff yourself by googling for "uiviewcontroller life cycle".
As you said, ViewDidLoad is only calling once after loading the view. So we can initialize the instances in the viewDidLoad. It is mainly meant for the initialization.
viewWillAppear will invoke whenever we reach to this view. So if there is any changes in UI, we can done it in viewWillAppear.
No. The name indicates that the controller's
view
has been loaded (not the controller itself). Actually the docs state that this method will get called after the view hierarchy has been loaded into memory (either vialoadView
or through a nib for example).Again, no.
loadView
(and as a consequenceviewDidLoad
) method will get called the first time thatview
property is to be accessed and isnil
(which is the case when you're initializing a controller). Think of this simple scenario:Well there is an order. We know for sure that
viewWillAppear
will always be called afterviewDidLoad
(if both of them are to be called of course).