Como criar um UIViewController com UINavigationController com o Interface Builder?
No meu aplicativo iOS, desejo fornecer uma visualização de configurações. "presentModalViewController" funciona muito bem:
ViewSettings *controller = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self.navigationController presentModalViewController:navController animated:YES];
[controller release];
[navController release];
Infelizmente, tenho que alterar meu código de execução e criar o ViewSettings incluindo o UINavigationController no Interface Builder. Por quê? Longa história, vou explicar no final deste tópico ...
Tento arrastar e soltar um UINavigationController no meu ViewSettings e criar um IBOutlet para acessá-lo na minha classe. Dou esse controlador para "presentModalViewController", mas o aplicativo travou ...
O que estou fazendo de errado?
[EDITAR]
Mensagem de erro:GDB: Sinal de programa recebido: "SIGABRT".
O erro ocorre na última linha deste 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];
Erro detalhado:Finalizando o aplicativo devido à exceção não capturada 'NSInvalidArgumentException', motivo: 'O aplicativo tentou apresentar um controlador de exibição modal nulo no destino.'
[/EDITAR]
[EDIT2]
Obrigado pela ajuda! Sim, navigationController é nulo ... Acho que adicionei o UINavigationController de maneira incorreta ... Coloquei-o nesta janela, porque não era possível colocá-lo diretamente na minha opinião:
Preciso de uma imagem de plano de fundo na minha UINavigationBar. Minha primeira tentativa foi:
UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar addSubview:imageView];
[self.navigationController.navigationBar sendSubviewToBack:imageView];
Mas em alguns problemas, o título de um UIBarButton não é visível! Eu tentei muito, por exemplo define a "tag" da visualização e sendSubviewToBack em cada visualização, mas sem êxito. Este é um bug muito chato!
Minha segunda tentativa foi criar uma categoria e substituir o 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
Mas agora, todas as minhas UINavigationBars têm uma imagem de plano de fundo e não posso desativá-la. O problema é que "ViewSettings" precisa da imagem de plano de fundo, mas as seguintes visualizações empurradas não.
Infelizmente, não é possível definir uma propriedade em uma categoria ou chamar [super drawRect: rect] para evitar pintar a imagem.
Minha última tentativa é escrever um UINavigationBar próprio
@interface OwnNavigationBar : UINavigationBar {
BOOL _drawHeaderImage;
}
Agora eu posso controlar o método drawRect !! ÓTIMO!!
- (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];
}
}
Mas eu celebro cedo ... :-( Não é possível definir um UINavigationBar próprio no UINavigationController !!! "navigationBar" no UINavigationController é uma propriedade somente leitura! AAAAHHHHHHHHHH!
Tenho uma última chance: no Interface Builder, é possível atribuir ao UINavigationController uma UINavigationBar própria !! SIM! DEIXA COMIGO!! :-)
Eu o configurei no meu MainWindow_iPhone.xib e funciona muito bem! Agora, eu tenho que implementar isso no meu ViewSettings, porque esse modo de exibição (modal) precisa de um novo UINavigationController.
PS: Talvez alguém possa enviar esse tópico para a Apple, tudo isso são circunstâncias e bugs muito irritantes :-(