Comment créer un UIViewController avec UINavigationController avec Interface Builder?

Dans mon application iOS, je veux fournir un des paramètres de l'affichage. "presentModalViewController" fonctionne très 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];

Malheureusement, j'ai du modifier mon code en cours d'exécution et de créer de la ViewSettings y compris la UINavigationController dans Interface Builder. Pourquoi? C'est une longue histoire, je vais l'expliquer dans la fin de ce fil...

J'essaie de faire glisser et de déposer un UINavigationController dans mon ViewSettings et de créer un IBOutlet pour y accéder dans ma classe. Je donne ce contrôleur pour "presentModalViewController", mais l'application s'est écrasé...

Ce que je fais mal?


[MODIFIER]

Message d'erreur: GDB: Programme du signal reçu: "SIGABRT".
L'erreur se produit dans la dernière ligne de ce code:

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];

Détaillée de l'Erreur: Résiliation d'application en raison de uncaught exception 'NSInvalidArgumentException', la raison: "l'Application a essayé de présenter un néant modal-vue-contrôleur sur la cible .'

[/EDIT]


[EDIT2]
Merci pour votre aide!
Oui, navigationController est nul...
Je pense que j'ai ajouter le UINavigationController dans un mauvais chemin... je l'ai mis dans cette fenêtre, car il n'était pas possible de le mettre directement dans mon point de vue:
Comment créer un UIViewController avec UINavigationController avec Interface Builder?
Comment puis-je ajouter de la UINavigationController correct?
[/EDIT2]


PS: Pourquoi dois-je utiliser de l'IB? (vous pouvez sauter cette...)

J'ai besoin d'une image de fond dans mon UINavigationBar. Mon premier essai était:

UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar addSubview:imageView];
[self.navigationController.navigationBar sendSubviewToBack:imageView];

Mais sur certaines questions, le titre de l'oder un UIBarButton n'est pas visible! J'ai essayé beaucoup de choses, par exemple, définit le "tag" de la vue et sendSubviewToBack dans chaque vue, mais sans succès. C'est un bug très désagréable!

Mon deuxième essai était de créer une catégorie et d'écraser la drawRect-méthode:

@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

Mais maintenant, tous mes UINavigationBars avoir une image de fond et je ne peux pas le désactiver. Le problème, c'est que "ViewSettings" a besoin de l'image d'arrière-plan, mais la suite poussé points de vue ne sont pas.

Malheureusement, il n'est pas possible de définir une propriété dans une catégorie ou d'appel [super drawRect:rect] pour éviter de peindre l'image.

Mon dernier essai est d'écrire un UINavigationBar

@interface OwnNavigationBar : UINavigationBar {
    BOOL _drawHeaderImage;
}

Maintenant je peux contrôler le drawRect-méthode!! SUPER!!

- (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];
    }
}

Mais j'ai célébrer au début... 🙁
Il n'est pas possible de définir une propre UINavigationBar dans le UINavigationController!!!
"navigationBar" dans UINavigationController est une propriété en lecture seule!
AAAAHHHHHHHHHH!

J'ai une dernière chance: dans Interface Builder, il est possible de donner un UINavigationController un UINavigationBar!!
OUI! JE L'AI EU!! 🙂

Je l'ai configuré dans mon MainWindow_iPhone.xib et il fonctionne très bien!
Maintenant, je dois mettre en œuvre ce pour mon ViewSettings, parce que c' (modal) vue a besoin d'un nouveau UINavigationController.

PS: Peut-être, quelqu'un peut envoyer ce fil pour Apple, ce sont toutes très ennuyeux circonstances et de bugs 🙁

Est-il des messages d'erreur lorsque l'incident se produit?
Qu'est-ce que le crash de l'erreur et de la trace de la pile?
GDB: Programme du signal reçu: "SIGABRT". Je vais modifier ma question ci-dessus, veuillez patienter un instant...
C'est un joli générique d'erreur, vous pouvez en dire beaucoup plus à partir de la visualisation du journal de débogage. Assurez-vous que vous exécutez en mode débogage, puis cliquez sur le petit "show console" bouton après qu'il se bloque. Puis après la réelle crash de l'erreur et de la trace de la pile, ce qui devrait aider un peu plus 😉
*** Fin de l'app en raison de uncaught exception 'NSInvalidArgumentException', la raison: "l'Application a essayé de présenter un néant modal-vue-contrôleur sur la cible <UINavigationController: 0x4d3cdc0>.'

OriginalL'auteur Manni | 2011-01-05