¿Cómo crear un UIViewController con UINavigationController con Interface Builder?
En mi aplicación iOS, quiero proporcionar una vista de configuración. "presentModalViewController" funciona muy bien:
ViewSettings *controller = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self.navigationController presentModalViewController:navController animated:YES];
[controller release];
[navController release];
Desafortunadamente, tengo que cambiar mi código de ejecución y crear ViewSettings, incluido el UINavigationController en Interface Builder. ¿Por qué? Larga historia, lo explicaré al final de este hilo ...
Intento arrastrar y soltar un UINavigationController en mi ViewSettings y crear un IBOutlet para acceder a él en mi clase. Doy este controlador a "presentModalViewController" pero la aplicación se bloqueó ...
¿Qué estoy haciendo mal?
[EDITAR]
Mensaje de error:GDB: Señal recibida del programa: "SIGABRT".
El error ocurre en la última línea de este código:
ViewSettings *viewSettings = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = viewSettings.navigationController;
UINavigationBar *navBar = navController.navigationBar;
OwnNavigationBar *ownNavBar = (OwnNavigationBar *)navBar;
[ownNavBar drawHeaderImage:YES];
[self.navigationController presentModalViewController:navController animated:YES];
Error detallado:Finalización de la aplicación debido a la excepción no detectada 'NSInvalidArgumentException', razón: 'La aplicación intentó presentar un controlador de vista modal nulo en el destino'.
[/EDITAR]
[EDIT2]
¡Gracias por tu ayuda! Sí, navigationController es nulo ... creo que agregué UINavigationController de forma incorrecta ... Lo puse en esta ventana, porque no fue posible ponerlo directamente en mi punto de vista:
¿Cómo agrego el UINavigationController correcto?
[/ EDIT2]
Necesito una imagen de fondo en mi UINavigationBar. Mi primer intento fue:
UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar addSubview:imageView];
[self.navigationController.navigationBar sendSubviewToBack:imageView];
¡Pero en algunos números, el título de un UIBarButton no es visible! Intenté mucho, p. establece la "etiqueta" de la vista y sendSubviewToBack en cada vista, pero sin éxito. Este es un error muy molesto!
Mi segundo intento fue crear una categoría y sobrescribir el método drawRect:
@implementation UINavigationBar(MyNavigationBar)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"header.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
Pero ahora, todos mis UINavigationBars tienen una imagen de fondo y no puedo desactivarla. El problema es que "ViewSettings" necesita la imagen de fondo, pero las siguientes vistas empujadas no.
Desafortunadamente, no es posible establecer una propiedad en una categoría o llamar a [super drawRect: rect] para evitar pintar la imagen.
Mi último intento es escribir una barra UINavigationBar propia
@interface OwnNavigationBar : UINavigationBar {
BOOL _drawHeaderImage;
}
¡Ahora puedo controlar el método drawRect! ¡¡EXCELENTE!!
- (void)drawRect:(CGRect)rect {
if (_drawHeaderImage) {
UIImage *image = [UIImage imageNamed: @"header.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
else {
[super drawRect: rect];
}
}
Pero lo celebro temprano ... :-( ¡No es posible configurar un UINavigationBar propio en el UINavigationController! ¡"NavigationBar" en UINavigationController es una propiedad de solo lectura! AAAAHHHHHHHHHH!
¡Tengo una última oportunidad: en Interface Builder es posible darle a UINavigationController un UINavigationBar propio! ¡SI! ¡¡LO TENGO!! :-)
Lo configuré en mi MainWindow_iPhone.xib y funciona muy bien. Ahora, tengo que implementar esto para mi ViewSettings, porque esta vista (modal) necesita un nuevo UINavigationController.
PD: Tal vez, alguien puede enviar este hilo a Apple, todo esto son circunstancias muy molestas y errores :-(