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:
Como adiciono o UINavigationController correto?
[/ EDIT2]

PS: Por que tenho que usar o IB? (você pode pular isso ...)

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 :-(

questionAnswers(2)

yourAnswerToTheQuestion