2009-11-12 4 views
25

J'ai du mal à me concentrer sur le chargement des vues avec Interface Builder et NSViewController.NSViewController et plusieurs sous-vues à partir d'un Nib

Mon objectif est d'avoir une vue qui rencontre la description suivante: Barre supérieure en haut (comme une barre d'outils mais pas exactement) qui couvre toute la largeur de la vue, et une seconde "vue du contenu" ci-dessous. Cette vue composite appartient à ma sous-classe NSViewController.

Il était logique d'utiliser Interface Builder pour cela. J'ai créé une plume de vue, et y ai ajouté deux sous-vues, les ai disposées correctement (avec la barre supérieure et la vue de contenu). J'ai mis File's Owner pour être MyViewController, et les prises connexes et autres. Les vues que je souhaite charger (la barre et le contenu) sont également dans leurs propres pointes (cela pourrait être ce qui me trébuche) et ces plumes ont leur classe personnalisée définie sur la sous-classe NSView respective, le cas échéant. Je ne sais pas quoi définir comme File's Owner (je devine MyController car il devrait être leur propriétaire). Hélas, lorsque je lance une instance de MyViewController, aucune de mes pointes ne s'affiche réellement. Je l'ai ajouté au contenu de ma fenêtre correctement (j'ai vérifié autrement), et en fait, les choses en quelque sorte charger. C'est-à-dire, awakeFromNib est envoyé à la vue de la barre, mais il ne s'affiche pas dans la fenêtre. Je pense que j'ai certainement des fils croisés quelque part. Peut-être que quelqu'un pourrait donner un coup de main pour soulager une partie de ma frustration?

EDIT code pour montrer ce que je fais

Le contrôleur est chargé lorsque mon application se termine le lancement, du délégué de l'application:

MyController *controller = [[MyController alloc] initWithNibName:@"MyController" bundle:nil]; 
[window setContentView:[controller view]]; 

Et puis dans mon initWithNibName Je ne Je ne ferais rien mais j'appellerais super pour le moment.

+0

Postez votre code. La façon dont vous initialisez votre contrôleur de vue n'est pas claire. –

Répondre

71

Quand sortir chaque vue dans sa propre plume et en utilisant NSViewController, la façon typique de la manipulation des choses est de créer une sous-classe NSViewController pour chacun de vos grué. Le propriétaire du fichier pour chaque fichier nib respectif serait alors défini sur cette sous-classe NSViewController, et vous connecteriez la prise view à votre vue personnalisée dans la plume. Puis, dans le contrôleur de vue qui contrôle la vue du contenu de la fenêtre principale, instanciez une instance de chaque sous-classe NSViewController, puis ajoutez la vue de ce contrôleur à votre fenêtre.

Un peu rapide code - dans ce code, j'appelle le point de vue du contenu principal contrôleur MainViewController, le contrôleur de la « barre d'outils » est TopViewController, et le reste du contenu est ContentViewController

//MainViewController.h 
@interface MainViewController : NSViewController 
{ 
    //These would just be custom views included in the main nib file that serve 
    //as placeholders for where to insert the views coming from other nibs 
    IBOutlet NSView* topView; 
    IBOutlet NSView* contentView; 
    TopViewController* topViewController; 
    ContentViewController* contentViewController; 
} 

@end 

//MainViewController.m 
@implementation MainViewController 

//loadView is declared in NSViewController, but awakeFromNib would work also 
//this is preferred to doing things in initWithNibName:bundle: because 
//views are loaded lazily, so you don't need to go loading the other nibs 
//until your own nib has actually been loaded. 
- (void)loadView 
{ 
    [super loadView]; 
    topViewController = [[TopViewController alloc] initWithNibName:@"TopView" bundle:nil]; 
    [[topViewController view] setFrame:[topView frame]]; 
    [[self view] replaceSubview:topView with:[topViewController view]]; 
    contentViewController = [[ContentViewController alloc] initWithNibName:@"ContentView" bundle:nil]; 
    [[contentViewController view] setFrame:[contentView frame]]; 
    [[self view] replaceSubview:contentView with:[contentViewController view]]; 
} 

@end 
+0

Fonctionne comme un charme. Merci pour l'exemple et aussi l'explication approfondie! – jbrennan

+0

Merci, c'était très utile. ++ – ttvd

2

MainViewController ne devrait-il pas être une sous-classe de NSWindowController? Et les points de vente dans la classe connecté pour afficher les éléments dans la fenêtre principale dans MainMenu.xib? Espérons que les anciens threads sont encore lus ...

+1

Ce n'est pas nécessaire. À mon avis, il est même judicieux de séparer un contrôleur de fenêtre du contrôleur de vue qui gère la vue de contenu de toute la fenêtre. Une fenêtre a beaucoup plus de pièces et de fonctionnalités qu'une vue (avec un contrôleur de vue correspondant). –

Questions connexes