Cómo agregar un UINavigationController a un UIViewController existente mediante progtwigción

Soy novato en la progtwigción de iOS, y este problema puede parecer estúpido a alguien, lo siento. Tengo un problema aquí es que tengo un UIViewController (A) existente y otro UIViewController (B), quiero agregar un UINavigationController a A tal que cuando presiono un button en A, me conducirán a B. Intenté El siguiente enfoque, pero no resuelve el problema:

en AppDelegate:

@synthesize navigationController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.tabbarController = [[UITabBarController alloc] init]; UIViewController *viewController_1 = [[WUSTLViewController_1 alloc] init]; UIViewController *viewController_2 = [[WUSTLViewController_2 alloc] init]; UIViewController *viewController_3 = [[WUSTLViewController_3 alloc] init]; navigationController = [[UINavigationController alloc] initWithRootViewController: viewController_3]; self.tabbarController.viewControllers = [NSArray arrayWithObjects:viewController_1, viewController_2, navigationController, nil]; self.window.rootViewController = self.tabbarController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } 

En WUSTLViewController_3.h (A):

 #import <UIKit/UIKit.h> #import "WUSTLViewController_4.h" @interface WUSTLViewController_3 : UIViewController { WUSTLViewController_4 *viewController_4; } @property UINavigationController *navigationController; @end 

En WUSTLViewController_3.m (A):

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. viewController_4 = [[WUSTLViewController_4 alloc] init]; UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; myButton.frame = CGRectMake(80, 50, 150, 40); [myButton setTitle:@"Push" forState:UIControlStateNormal]; [myButton addTarget:self action:@selector(pressButton:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:myButton]; } - (IBAction)pressButton:(id)sender { [self.navigationController pushViewController:viewController_4 animated:YES]; } 

Cuando hago clic en el button, no pasa nada.

Esta no es la forma en que trabajan los UINavigationControllers . rootViewController establecer A como rootViewController de su UINavigationController . UINavigationController es un contenedor para otros controlleres de vista.

Por ejemplo, en su AppDelegate puede hacer algo como esto:

 UIViewController *A = [[UIViewController alloc] init]; UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:A]; UIViewController *X = [[UIViewController alloc] init]; UIViewController *Y = [[UIViewController alloc] init]; UIViewController *Z = [[UIViewController alloc] init]; UITabBarController *tabVC = [[UITabBarController alloc] init]; tabVC.viewControllers = @[X, Y, Z, navVC]; self.window.rootViewController = tabVC; 

Y en A

 - (IBAction)pressButton:(id)sender { [self.navigationController pushViewController:B animated:YES]; } 

El problema es que A debe estar en un controller de navigation antes de que pueda presionar B.

Si A ya está en un controller de navigation:

 [A.navigationController pushViewController:B animated:YES]; 

Si A no está en un controller de navigation, entonces debe pensar cómo desea que se muestren las vistas de su aplicación.

  1. Coloque A en un controller de navigation.
  2. Presente un controller de navigation de A como controller de vista presentado.

Si opta por la opción 1, entonces, cuando se cargue A, ya estará en un controller de navigation. Solo necesitas presionar B.

 [A.navigationController pushViewController:B animated:YES]; 

Si opta por la opción 2, debe presentar el controller de navigation desde A.

 UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:B]; [A presentViewController:navigationController animated:YES completion:NULL]; 

NOTA: Esto creará una nueva stack de navigation con B como raíz. Deberá tener alguna forma de descartar el controller de navigation, cuando haya terminado.

 [A dismissViewControllerAnimated:YES completion:NULL]; 

Si desea descartar el controller de navigation desde dentro de B, entonces debe hacer lo siguiente.

 [B.navigationController.presentingViewController dismissViewControllerAnimated:YES completion:NULL]; 

Es decir, desde B, obtenga el controller de navigation, y desde el controller de navigation, obtenga el controller de vista de presentación (que es A).