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 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 🙁
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
Vous devez vous connecter pour publier un commentaire.
Lorsque vous init vue contrôleur à partir d'une plume, il ne fait pas de charge de la plume, afin
viewSettings.navigationController
est toujours nul. La première fois que vous faites référence à laview
propriété, la plume sera chargé.Mise à jour
Vous pouvez charger la plume vous-même et prenez la manette de navigation, comme suit:
J'ai utilisé de l'objet à l'index 1, parce que dans votre capture d'écran il y a une tableview qui je pense sera l'index 0.
Mise à jour de ma réponse
J'ai essayer "NSArray *plumes = [[NSBundle mainBundle] loadNibNamed:@"ViewSettings" propriétaire:auto options:nil];" mais ce message d'erreur: "cette classe n'est pas la valeur de la clé de codage conforme à la clé navigationController" Il y a beaucoup de discussions avec ce message d'erreur, mais je ne sais pas où est mon erreur est de 🙁 je pense, je me connecte le UINavigationController dans un mauvais sens dans Interface Builder. Mais comment faites-vous cela correct? Je viens de tirer et déposer les UINavigationController dans le ViewSettings.xib (voir Capture d'écran) et de définir le "Référencement des points de vente" à "navigationController". S'il vous plaît aider...
Ce type d'objet est le Propriétaire du Fichier dans la plume?
"ViewSettings" est un UITableViewController. J'ai créer dans Xcode: "un Nouveau Fichier... -> sous-classe UIViewController" et active la case à cocher "UITableViewController sous-classe" et "Avec XIB pour l'interface utilisateur". Donc, j'ai 3 fichiers générés: ViewSettings.h, ViewSettings.m et ViewSettings.xib
OriginalL'auteur Brian
Il serait utile si vous deviez afficher le contenu de votre fichier nib parce que je soupçonne
viewSettings.navigationController
est nul.navigationController
est une propriété de tous lesUIViewControllers
qui vous donne leur parent de navigation-vue-contrôleur, s'il en existe un. Il sonne comme vous n'avez jamais ajouté à votreviewSettings
- vue-contrôleur à une manette de navigation de la pile de vue des contrôleurs.OriginalL'auteur Jonah