I changed navigation in my application from using UITabBarController to u UINavigationController. I.e. former solution (1st version) was based only on the TabBarController - 4 ViewControllers (one simple TableView, one simple custom view and one MapView with many overlays). The second version is based only on the UINavigationController.
In case of TabBarController it was clear and simple, everything worked fine, especially MapView. I mean: the MapView was loaded once (with a significant number of overlays) and when I went to another view and back to the MapView the MapView was still there with its overlays already loaded and displayed (simple check: MapView`s viewDidLoad was called just once per app run, I had some debug messages there).
Now I changed navigation logic to the UINavigationController. Everything works fine for the first look - but: the viewDidLoad (for each view) is called everytime I navigate to the view. It is annoying especially in the case of the MapView - the loading of overlays is performed everytime, it takes some time and it causes app crash in some cases.
OK, my questions:
Is it some kind of "common" behavior of NavigationController?
Can I change this behavior so viewDidLoad will be called just once?
And more - How can I influence the "display sequence" of some view?
I understand the logic is probably more complicated but I appreciate any answer or hint ;)
Some related circumstances:
A UITabBarController
and UINavigationController
are based on fundamentally different paradigms.
The UITabBarController
is intended for the UIViewController
on each tab to exist independently of each other and for the user to choose which they want to view. viewDidLoad
only gets called once for each UIViewController
because it is intended that each tab still exists in memory even as the user switches to a different tab.
The UINavigationController
is a stack of UIViewControllers
where each is related to the one above and beneath itself. The top UIViewController
in the stack is always the one that is visible to the user. When a UIViewController
is pushed to the stack, its viewDidLoad
gets called because it is being loaded into memory. When the top UIViewController
gets poped off the stack, it is unloaded from memory, and viewDidUnload
gets called on the way out (viewDidUnload
is deprecated in iOS6 and won't get called, but the controller will still get dumped from memory). This is why viewDidLoad
gets called every time that the user pushes a particular UIViewController
onto the UINavigationController
stack.