2009-11-12 12 views
25

Ich habe eine schwierige Zeit um den Laden von Ansichten mit Interface Builder und NSViewController.NSViewController und mehrere Unteransichten von einer Nib

Mein Ziel ist es, eine Ansicht zu haben, die der folgenden Beschreibung entspricht: Obere Leiste oben (wie eine Symbolleiste, aber nicht genau), die sich über die gesamte Breite der Ansicht erstreckt, und eine zweite "Inhaltsansicht" unten. Diese zusammengesetzte Ansicht gehört meiner Unterklasse NSViewController.

Es hat Sinn gemacht, Interface Builder dafür zu verwenden. Ich habe eine Ansichts-Nib erstellt und zwei Unteransichten hinzugefügt, die richtig angeordnet wurden (mit der oberen Leiste und der Inhaltsansicht). Ich habe File's Owner zu MyViewController, und angeschlossenen Steckdosen und so eingestellt.

Die Ansichten, die ich laden möchte (die Leiste und der Inhalt), befinden sich auch in ihren eigenen Nibs (das könnte mich stolpern), und diese Nibs haben ihre benutzerdefinierte Klasse auf die jeweilige NSView-Unterklasse gesetzt. Ich bin nicht sicher, was ich als ihre File's Owner (ich vermute MyController, wie es ihr Besitzer sein sollte) festlegen.

Leider, wenn ich eine Instanz von MyViewController init initiiere keiner meiner Spitzen tatsächlich angezeigt. Ich habe es meiner contentView meines Fensters richtig hinzugefügt (ich habe es anders überprüft), und tatsächlich, Dinge sortieren irgendwie. Das heißt, awakeFromNib wird an die Balkenansicht gesendet, wird jedoch nicht im Fenster angezeigt. Ich glaube, ich habe definitiv irgendwo Kabel gekreuzt. Vielleicht könnte mir jemand helfen, um meine Frustration zu lindern?

EDIT einige Code zu zeigen, was ich

Der Controller tun wird geladen, wenn meine Anwendung startet beendet ist, vom AppDelegate:

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

Und dann in meiner initWithNibName I don‘ t mach alles, aber rufe jetzt super an.

+0

Sende deinen Code. Es ist nicht klar, wie Sie Ihren View-Controller initialisieren. –

Antwort

71

Wenn Sie jede Ansicht in ihre eigene Schreibfeder ausbrechen und NSViewController verwenden, besteht die typische Vorgehensweise darin, eine NSViewController Unterklasse für jede Ihrer Schreibspitzen zu erstellen. Der Eigentümer der Datei für die jeweilige NIB-Datei würde dann auf die Unterklasse NSViewController gesetzt, und Sie würden die view Steckdose an Ihre benutzerdefinierte Ansicht in der Nib anschließen. Anschließend instanziieren Sie in dem Ansichtscontroller, der die Inhaltsansicht des Hauptfensters steuert, eine Instanz jeder Unterklasse NSViewController und fügen dann die Ansicht dieses Controllers Ihrem Fenster hinzu.

Ein schnelles Stück Code - in diesem Code, ich bin der Hauptinhalt View-Controller MainViewController Aufruf, die Steuerung für die "Symbolleiste" ist TopViewController, und der Rest des Inhalts ist 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

Funktioniert wie ein Charme. Danke für das Beispiel und die ausführliche Erklärung! – jbrennan

+0

Danke, das war sehr hilfreich. ++ – ttvd

2

Sollte MainViewController nicht eine Unterklasse von NSWindowController sein? Und die Steckdosen in der Klasse, die verbunden sind, um Elemente im Hauptfenster in MainMenu.xib anzusehen? Lass uns hoffen, dass alte Threads noch gelesen werden ...

+1

Es ist nicht notwendig. Meiner Meinung nach ist es sogar eine gute Übung, einen Fenster-Controller vom View-Controller zu trennen, der die Inhaltsansicht des gesamten Fensters verwaltet. Ein Fenster hat wesentlich mehr Teile und Funktionen als eine Ansicht (mit einem entsprechenden View-Controller). –

Verwandte Themen