I do this in my app, Litho Graph. If you're on a page when you quit, then the next time you launch, it restores you to that page. It's pretty easy, too: in my main view controller's -viewDidLoad implementation, I check for the last page viewed key in the user defaults. If there's nothing, I continue as normal (and show a list of all pages). If there's something, I open that page (pushing the new view controller onto the navigation controller stack).
The actual loading of the view controllers is very straightforward: I just instantiate them. Each of my view controller classes has overridden -init to call -initWithNibName:bundle: on super, so calling +alloc and -init to create the view controller instance is enough to load it from the appropriate .xib file. Then, as described above, I push it onto the navigation controller's stack:
[self.navigationController pushViewController: controller animated: YES];
You can do this as many layers deep as you need to, of course, but bear in mind that you may want to push the view controllers without animation if there's going to be several transitions; it would be counterproductive for the user to have to wait through several animations (: