6

Tengo un problema al configurar un Outlet de vista predeterminado de View Nib Controller en el Interface Builder. Aquí está mi configuración:UINavigationController NIB requiere que el propietario del archivo tenga una vista?

Tengo una aplicación basada en TabBar cargo un regulador de la navegación como una vista modal ...

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil]; 
[tabBarController presentModalViewController:menu animated:anim]; 

MenuController mismo está estructurado de la siguiente manera:

 
MenuController.xib 
    File's Owner (MyNavCtrlrSubClass : UIViewController) 
    Navigation Controller (UINavigationController) 
    Navigation Bar (UINavigationBar) 
    Root View Controller (Nib Name is set to load AnotherViewController.nib) 
     Navigation Item -> (UINavigationItem) 

Todo esto funciona bien, excepto que cuando se carga MyNavCtrlrSubClass, aparece el siguiente error:

Loaded the "MenuController" nib but the view outlet was not set

Está claro por qué sucede esto: el propietario del archivo no tiene una conexión de salida para su vista. La pregunta es, ¿qué debería establecer como su vista, y tiene que establecerse algo en primer lugar? La barra de navegación es el único candidato en MenuController.xib, pero hacer esto simplemente cambiará el tamaño de UINavigationBar en el modo de pantalla completa, por así decirlo.

Obviamente me falta algo en IB, pero ¿qué? MyNavCtrlrSubClass.m no tiene código en sí, excepto un IBOutlet para UINavigationController. ¿Estoy cometiendo un error al tratar de configurar esto en IB? La idea es mantener el Controlador de navegación modal en una plumilla y todas las vistas que se cargan en plumillas separadas, pero como MenuController es solo un contenedor para la navegación y no contiene ninguna vista en sí, obviamente estoy diseñando mal. :)

Si se está preguntando por qué no lo estoy diseñando de otra manera, es porque estoy tratando de obedecer a mi percepción (posiblemente errónea) de cómo IB le pide que cree una jerarquía ideal.

Cualquier ayuda sería muy apreciada.

Respuesta

5

Creo que es posible que no comprenda cómo se pretende que el propietario del archivo se utilice en un archivo NIB. He escrito una respuesta que describe el propietario del archivo under another question.

Cuando se invoca esta línea:

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil] 

Se crea una instancia de MyNavCtrlrSubClass, y decirle que cargue @ "MenuController". Luego, en el archivo MenuController.xib, hay un segundo UINavigationController no relacionado con cosas dentro de él. Cuando MenuController.nib se carga en tiempo de ejecución, se creará ese segundo controlador de navegación.

Un segundo problema es que decirle a un UINavigationController que cargue un archivo NIB no es realmente sensato porque los controladores de navegación crean y administran sus propias vistas. Realmente desea crear el controlador de vista raíz y decirle a ese controlador de vista que cargue un archivo NIB.

Prueba esto:

MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease]; 
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController]; 

Cuando el archivo XI ter ve así:

  • del propietario del archivo (Clase establecido en MyRootViewController, vista salida conectada a UIView posterior)
  • UIView
    • Subvista A
    • subvista B

Después de que esté cómodo con cómo todo esto funciona, también se podría considerar una instancia del controlador de navegación y la raíz controlador de vista en un archivo XI ter como si estuviera empezando a hacer en el código publicaste

+0

¡Gracias por la respuesta informativa! Estoy a punto de ver qué puedo hacer con esto, y volveré a publicar pronto. Por ahora, permítanme preguntar: ¿cómo cargarían una punta modal del controlador de navegación, diseñando tanto como sea posible en Interface Builder? ¿Es necesario, como en su ejemplo, configurar una plumilla Ver Controlador y luego crear el Controlador de Navegación programáticamente, o puedo definir la jerarquía de vista solo en IB? –

+0

NOTA: parece que crear el Controlador de navegación programmicamente significaría que también tengo que configurar su propia jerarquía de controlador de vista mediante programación, y entonces me estoy alejando cada vez más de IB, comenzando con el controlador de navegación hacia abajo. –

+1

Puede crear un controlador de navegación y un controlador de vista raíz en el código, y cargar la vista para el controlador de vista raíz en IB. No será incómodo. También puede crear el controlador de navegación y su controlador de vista raíz en un XIB separado de la vista del controlador de vista raíz. Esta XIB separada es típicamente MainWindow.xib. Cuando se carga el archivo MainWindow.xib, se crearán los dos controladores de vista. Cuando el controlador de vista raíz primero necesita su vista, lo cargará desde el segundo archivo XIB. Esa es la forma típica de hacer esto. –

0

En IB, en la punta de MenuController, agregue una UIView y configure esa vista como la salida. Deberá configurar esa vista para un UIViewController. Here es un enlace rápido a una página de Apple que muestra una configuración básica. Sin embargo, no estoy seguro si te ayudará en tu etapa actual.

+0

El problema es que no hay vista en mi plumilla del controlador de navegación para conectar. Las limitaciones son que quiero separar cada plumilla individual, por lo que mi problema es conceptual o de diseño, no es un problema de implementación. Gracias en cualquier caso. –

+0

¿Qué vista se establece para AnotherViewController? Parece que ahí es donde está el problema. – Jordan

+0

AnotherViewController es solo una plumilla View Controller con una sola vista. Sin embargo, ni siquiera se está cargando. El problema ocurre en algún lugar del ciclo de vida cuando MenuController quiere una vista, pero en lugar de lo que esperaba sería la propagación automágicamente de la solicitud por los controles, simplemente arroja el error antes mencionado. Sin embargo, por su respuesta, parece que está implicando que el Dueño del archivo de un plumín no necesariamente necesita un plumín. ¿Es eso tu comprensión? –

1

El meollo de esta pregunta es planteada por el propio Travis: "¿Cómo cargaría la punta del controlador de navegación, diseñando tanto como sea posible en Interface Builder?" Y también del ejemplo, parece que esto significa el UINavigationController y los UIViewControllers asociados.

Con esta interpretación, la respuesta es que no puede configurar completamente un UINavigationController y sus UIViewControllers en un solo XIB. Sí, es intuitivo querer hacer esto para que no estés loco.

Cuando digo que no se puede hacer esto, me refiero a que los métodos de framework más comúnmente utilizados no tienen una forma de manejar esto. No hay [UINavigationController alloc] initWithMegaNibName. Sí, podrías rellenar casi cualquier cosa en un solo XIB y escribir código para hidratar objetos de maneras especiales, pero no creo que eso es lo que estás buscando.

Puede usar dos o más XIB como Jon sugirió, pero luego las cosas son menos autónomas y por lo tanto hay mucha gente a la que le resulta más sencillo hacer una parte o la totalidad de los controladores en el código.

Lamentablemente, no existe una correspondencia 1: 1 entre la capacidad de Interface Builder y el código, como ocurre en otras plataformas de desarrollo. Por lo general, prefiero permitir que los diseñadores participen tanto como sea posible en la creación de activos, pero la mayoría de ellos que conozco no codifican objetivo-c.

Cuestiones relacionadas