13

1. Paso: Crear un nuevo UIViewController:
- Xcode -> Nuevo archivo ... -> Cocoa Touch Clase -> UIViewController
- Nombre: MyViewController¿Cómo agregar un controlador de navegación con Interface Builder?

2. Paso: Arrastrar y soltar un "Navigation Controller" (UINavigationController) de la Biblioteca de MyViewController.xib

alt text

3.Step: Estoy seguro de que tengo que hacer algo para conectar correctamente el Controlador de navegación, ¿no es así?

4.Step: intenta iniciar el nuevo controlador de vista como un diálogo modal:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
NSLog(@"navContr: %@", myViewController.navigationController); 
[self.navigationController presentModalViewController: myViewController animated:YES]; 

Resultado: "navContr: cero"

5.Step: Se puede ver la nueva vista modal (MyViewController), pero no hay NavigationController ni UINavigationBar.

¡Muchas gracias por su ayuda!


ACTUALIZACIÓN 1:

6.Step: que estableció un nuevo UIViewController (ViewNavi2) como "Raíz View Controller":
alt text

7.Step: Defino un IBOutlet UINavigationController *navigationController en la clase MyViewController y configuro el xib: Controlador de navegación -> Conexiones -> Referencias de tomacorrientes

Pero mi regulador de la navegación sigue siendo nula :-(

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
NSLog(@"navContr: %@", myViewController.navigationController); 
// -> "navContr: nil" 
+2

[aquí] (http://rdcworld-iphone.blogspot.in/2013/03/how-to-add-navigation-controller-in.html) es el sencillo tutorial para agregar el controlador de navegación – swiftBoy

Respuesta

15

También quería incluir el controlador de navegación en el archivo NIB, pero todo lo que la documentación de Apple decía era que no era "óptimo" "sin explicar cómo hacerlo". Quería que mi ventana con pestañas principal llamara a una ventana modal que contiene los controles de navegación típicos sin definir programáticamente el controlador de navegación. Compartiré cómo lo hice.

Su código era muy similar al mío, ya que también definí un IBOutlet UINavigationController *navigationController en MyViewController. Desde Interface Builder, simplemente definí mi vista en el controlador de la vista raíz y configuré la vista Owner-> del archivo para esa definición de vista.

Y de manera similar a su código, hice lo siguiente en la ventana de mi padre:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[self presentModalViewController:myViewController animated:YES]; 

(. Estoy llamando presentModelViewController en sí, no sé por qué tuvo self.navigationController) Cuando probé esto, el resultado fue que mi vista se cargó desde el archivo NIB, pero faltaba la barra de navegación. Una de las líneas más de código en MyViewController fijado esto:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setView:myNavigationController.view]; 

} 

Todo lo que estoy haciendo aquí, es establecer la visión de MyViewController para apuntar a myNavigationController.view, que contiene todo lo que se define en el archivo SEMILLA, incluyendo el control de navegación.

+1

¡Muchas gracias por su excelente respuesta! ¡Estoy seguro de que esto ayudará a mucha gente! :-) @todos: por favor VOTE UP – Manni

+0

@Henry Intenté hacer algo muy similar. Esto me ahorró mucho trabajo. ¡Gracias! – Besi

+0

Muy hermosa explicación. Gracias. –

0

El siguiente código es no le dará ningún objeto válido.

NSLog(@"navContr: %@", myViewController.navigationController); 

La razón es porque navigationController propiedad de UIViewController only returns a navigation controller if the view controller is in its stack. This property is nil if a navigation controller cannot be found. Su controlador de vista no está en la pila del mando de navegación. De todas formas, ni siquiera estoy seguro de si inicializaste correctamente nuestro controlador de navegación. Lea alguna documentación.

+0

Gracias por ti ¡ayuda también! Se ve que "el controlador de vista no está en su pila". Sí, creo que no he inicializado correctamente mi controlador de navegación. Pero, ¿cómo puedo hacer eso en Interface Builder? Actualizo mi pregunta, eche un vistazo a "ACTUALIZACIÓN 1". – Manni

+0

Además, si su vista SE ENCUENTRA en la pila del controlador de navegación pero usted (auto) la liberó en algún lugar que no debería tener, el control de auto.navegación podría ser nulo. Doh! – AndrewS

2

Mire la plantilla en XCode para una "Aplicación basada en navegación". (Nuevo proyecto -> Aplicación basada en navegación) Luego abra MainWindow.xib en Interface Builder. Aunque no es una vista, piense en ello como el controlador de vista que creó en el paso 1. Luego mire el "Controlador de vista de raíz" al que se hace referencia en el inspector y vea cómo está conectado al extremo "Controlador de vista de raíz" en el inspector de Atributos y la clase "RootViewController" en el inspector de Identidad.

Querrá poner el contenido que desea visualizar en la raíz de su navegación en su versión de "RootViewController". Normalmente, el controlador que se muestra a continuación es un "DetailViewController".Nuevamente, lea el código de ejemplo que proporciona la plantilla y verá cómo comenzar con eso. Mire el código comentado en didSelectRowAtIndexPath en la plantilla de ejemplo de RootViewController.m. Tendrá que crear su propio controlador de vista para que sirva como DetailViewController.

Esperemos que esto aclare las cosas para usted.

// EDITS basado en su comentario //
Los documentos de Apple dicen que si desea utilizar IB para hacer que sus controladores de navegación realmente debería ponerlos en su MainWindow.xib. Estaba jugando con el hecho de que no puedes tener NavigationController como una subvista de tu objeto UIView. Lo que puedes hacer desde donde has comenzado es usar IB para agregar un objeto de barra de navegación al controlador de vista y luego controlar las cosas desde allí.

De la documentación de Apple "Aunque también podría cargar controladores de navegación autónomos o presentados de forma modal desde su archivo de punta principal (o cualquier otro archivo Nib), hacerlo no es óptimo. En esos escenarios, generalmente es más fácil crear el controlador de navegación programáticamente en el punto de uso ".

// MÁS EDICIONES // En XCode4, la plantilla del proyecto ahora se llama proyecto "Detalle maestro". Esto se debe a que se configurará como un controlador de vista dividida en iPad pero seguirá siendo un proyecto de navegación regular en iPhone. Donde menciono "RootViewController" en la respuesta, ahora encontrará algo llamado "MasterViewController"

+0

¡Muchas gracias por su ayuda! Analizo cuidadosamente la aplicación basada en la navegación. Sí, hay un MainWindow.xib con un controlador de navegación en funcionamiento. Está conectado con AppDelegate, esa es la única diferencia con MyViewController. En el proyecto de plantilla, no se puede ver cómo MainWindow.xib se inicializa y tal vez mi código "MyViewController * myViewController = [[MyViewController alloc] initWithNibName: @" MyViewController "bundle: nil];" Está Mal. Por favor mira "ACTUALIZACIÓN 1" en mi pregunta. – Manni

+0

De la documentación de Apple "Aunque también podría cargar controladores de navegación autónomos o presentados de forma modal desde su archivo de punta principal (o cualquier otro archivo de punta), hacerlo no es óptimo. En esos escenarios, generalmente es más fácil crear el controlador de navegación mediante programación en el punto de uso ". – Walter

+0

Sí, tienes razón, sería más fácil crear el controlador de navegación programáticamente, pero tengo que hacer esto con el Interface Builder. La razón que puede encontrar aquí: http://stackoverflow.com/questions/4604647/how-to-create-an-uiviewcontroller-with-uinavigationcontroller-with-interface-buil ¿Todavía tiene algunas ideas para mí? – Manni

Cuestiones relacionadas