title: Pushing View Controller with Two Nav Controllers
body: <p>I've got an app where I am pushing a modal view controller. It is working fine, but I am concerned I haven't coded it in the most correct fashion. I have instanstiated two navigation controllers, which seems a bit dodgy to me.</p>
  
  <p>Basically I've created a tab bar controller with 3 tabs, then made one of those tabs / view controllers the root. Later I am (using some home-grown markup on core text) popping a view controller when the user touches a particular word in a paragraph. The pushed view controller has a back button which works fine and the app seems to be OK.</p>
  
  <p>Like I said it all works, but it seems I am coding in circles here. Is this correct?</p>
  
  <p><strong>AppDelegate.h</strong></p>
  
  <pre><code>#import &lt;Foundation/Foundation.h&gt;
  
  @interface AppDelegate : NSObject &lt;UIApplicationDelegate, UITabBarControllerDelegate&gt;
  {
      UIWindow *window;
      UITabBarController *tabBarController;
  }
  @property (strong, nonatomic) UIWindow *window;
  @property (strong, nonatomic) UITabBarController *tabBarController;
  @end
  </code></pre>
  
  <p><strong>From AppDelegate.m</strong></p>
  
  <pre><code>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  
      ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
      ViewController2 *viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
      ViewController3 *viewController3 = [[ViewController3 alloc] initWithNibName:@"ViewController3" bundle:nil];
  
      UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
      self.tabBarController = [[UITabBarController alloc] init];
      self.tabBarController.viewControllers = [NSArray arrayWithObjects:nav, viewController2, viewController3, nil];
      self.tabBarController.delegate = self;
      self.window.rootViewController = self.tabBarController;
      [self.window makeKeyAndVisible];
      return YES;
  }
  </code></pre>
  
  <p><strong>ViewController3.h</strong></p>
  
  <pre><code>#import &lt;UIKit/UIKit.h&gt;
  #import "JSCoreTextView.h"
  #import "PopupViewController.h"
  
  @class JSTwitterCoreTextView;
  
  @interface ReadingViewController : UIViewController &lt;JSCoreTextViewDelegate&gt;
  {
      JSTwitterCoreTextView *_textView;
      UIScrollView *_scrollView;
  }
  @end
  </code></pre>
  
  <p><strong>From ViewController3.m</strong></p>
  
  <p>Here I am instantiating another navigation controller. Is this a good idea?</p>
  
  <pre><code>- (void)textView:(JSCoreTextView *)textView linkTapped:(AHMarkedHyperlink *)link
  {
      PopupViewController *popupVC = [[PopupViewController alloc] initWithNibName:@"PopupViewController" bundle:nil];
      UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:popupVC];
      [nav setModalPresentationStyle:UIModalPresentationFullScreen];
      [nav setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
      [self presentModalViewController:nav animated:YES];
  }
  </code></pre>
  
  <p><strong>From PopupViewController.m</strong></p>
  
  <pre><code>- (void)viewDidLoad
  {
      [super viewDidLoad];
      [self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                   target:self 
                   action:@selector(done:)]];
  }
  
  - (void)done:(id)sender
  {
      [self.parentViewController dismissModalViewControllerAnimated:YES];
  }
  </code></pre>