15

Tengo una mis vistas y controladores configurados como tal.Acceso a un controlador de navegación superior desde una subvista Controlador de navegación

  1. Un controlador Tab/bar
  2. Dentro 1. es un controlador de vista raíz
  3. dentro 2. es un controlador de navegación creado mediante programación, que se muestra como una vista secundaria en el controlador de vista raíz.

Lo que estoy tratando de hacer es acceder a la barra de pestañas superior/controlador de navegación para que pueda presionar una vista sobre ella.

Intenté parentViewController pero todo lo que hice fue presionar la vista en el controlador de navegación programado.

alguna sugerencia?

Éste es cómo configurar mi controlador de vista raíz:

-(void)viewDidAppear:(BOOL)animated{ 
    NSLog(@"ROOT APPEARED"); 
    [super viewDidAppear:animated]; 

    WorklistViewController *worklistController = [[WorklistViewController alloc]initWithNibName:@"WorklistView" bundle:[NSBundle mainBundle]]; 
    UINavigationController *worklistNavController = [[UINavigationController alloc] initWithRootViewController:worklistController]; 
    worklistNavController.navigationBar.barStyle = UIBarStyleBlackOpaque; 
    worklistNavController.view.frame = watchlistView.frame; 
    [worklistNavController.topViewController viewDidLoad]; 
    [worklistNavController.topViewController viewWillAppear:YES]; 
    [self.view addSubview:worklistNavController.view]; 

    GetAlertRequestViewController *alertsController = [[GetAlertRequestViewController alloc]initWithNibName:@"AlertsView" bundle:[NSBundle mainBundle]]; 
    UINavigationController *alertsNavController = [[UINavigationController alloc] initWithRootViewController:alertsController]; 
    alertsNavController.navigationBar.barStyle = UIBarStyleBlackOpaque; 
    alertsNavController.view.frame = alertsView.frame; 
    [alertsNavController.topViewController viewDidLoad]; 
    [alertsNavController.topViewController viewWillAppear:YES]; 
    [self.view addSubview:alertsNavController.view]; 
} 

Respuesta

31

Un ViewController anidada (es decir, dentro de una visión controlado por un ViewController que en realidad es en la pila NavController) no tiene acceso directo a la UINavigationController que su padre El controlador de view es un miembro de la pila de. Esa es una PALABRA de una oración, pero el sentido de esto es: no puedes llegar allí desde aquí.

En su lugar, debe obtener en NavController de la aplicación a través del delegado de la aplicación.

YourAppDelegate *del = (YourAppDelegate *)[UIApplication sharedApplication].delegate; 
[del.navigationController pushViewController:nextViewController animated:YES]; 

Estás usando singleton de su UIApplication (contiene todo tipo de buena información sobre su aplicación), que tiene una propiedad .delegate que apunta a la AppDelegate, y que contiene una referencia a la NavigationController.

Así es como la plantilla Xcode "Aplicación basada en navegación" establece la propiedad de NavController, de todos modos. YMMV si imprimió la suya, aunque si lo hizo, probablemente no necesite hacer esta pregunta.

+1

Con iOS 4.0 como destino de despliegue, el código 'del.navigationController' genera un error de compilación: "Solicitud de navegación miembroControlador en algo que no es una estructura o unión" –

+0

@ Marcel: el delegado de su aplicación TIENE un controlador de navegación como propiedad con nombre, ¿derecho? –

+1

error: la propiedad 'navigationController' no se encuentra en el objeto del tipo 'AppDelegate *' –

0

Tener un vistazo a las propiedades navigationController y tabBarController de UIViewController. Estos devolverán el control de navegación o tabBarController correspondiente al que pertenece el UIViewController dado '.

Así que usted puede hacer algo como:

[customController.navigationController pushViewController:newController animated:YES]; 
// Similarly for tabBarController ... 
+0

Estoy un poco confundido en lo que quiere decir. La pila se vería así. 1. Controlador de navegación -> RootViewController -> 2. Controlador de navegación -> AViewConroller Y lo que quiero es que AViewController coloque un nuevo controlador de vista en 1.Navigation Controller. Pero no importa lo que intente, sigue presionándolo 2. ¿Controlador de navegación? Si eso lo hace más claro idk. Lo siento. – Matt

+0

Oye, actualicé mi publicación para que coincida con tu comentario. Es un poco extraño apilar dos controladores de navegación ya que uno hace lo mismo que el otro. De todos modos, compruebe mi sugerencia, ya que podría funcionar, pero no estoy 100% seguro. – nebs

+0

Lo siento, sé que es extraño, realmente no di un trasfondo. Tengo un controlador de barra de pestañas que tiene 3 pestañas/controladores. 1.Inicio 2. Búsqueda 3. Configuración. Dentro de la vista de raíz hay 3 tablas diferentes que tienen controladores de vista de control de navegación->. Muestran alertas, una lista de observación y búsquedas previas. Entonces, en el controlador de vista de lista de observación, cuando presiona visualizar flecha de documentos, quiero que tome el control de navegación superior para que se muestre toda la pantalla. Pero desafortunadamente ese código que me diste no funcionó. – Matt

10

Puede utilizar el seguimiento Instrucción:

[(UINavigationController *)self.view.window.rootViewController pushViewController:vc animated:YES]; 

Funciona para mí: D

Cuestiones relacionadas