NSWindowController
ルート ビューを含む があります。ルートビューには 4 NSButtons
、いくつかのテキストと画像があります。各ボタンは にバインドされていNSViewController
ます。ボタンの 1 つをクリックすると、ルート ビューが削除され、それにバインドされたビューNSViewController
(サブビューと呼びましょう) が表示されます。サブビューにはNSButton
、ウィンドウ コントローラに通知を送信してルート ビューを復元する があります。これが私のコードです(役に立たない部分のほとんどを削除しました)
WindowController.h
@interface MainWindowController : NSWindowController { IBOutlet NSView* myTargetView; // bound to the whole view of the window NSView* viewRoot; NSViewController* myCurrentViewController; } - (IBAction)buttonClicked:(id)sender; // Not shown in the implementation - (void)changeViewController:(NSInteger)buttonTag; - (void)restoreRootView; @end
WindowController.m
- initWithPath:(NSString *)newPath { return [super initWithWindowNibName:@"MainWindow"]; } - (void)windowDidLoad { vwRoot = [[[[self window] contentView] subviews] objectAtIndex:0]; // set up notification observer, will call restoreRootView when receiving notification from NSViewController object } - (void)changeViewController:(NSInteger)buttonTag { [vwRoot retain]; [vwRoot removeFromSuperview]; if (myCurrentViewController != nil) [myCurrentViewController release]; switch (buttonTag) { case kView1: { View1Controller * viewOneController = [[View1Controller alloc] initWithNibName:kViewOneTile bundle:nil]; if (viewOneController != nil) { myCurrentViewController = viewOneController; } break; } case kView2: { // and so on... } } [myTargetView addSubview: [myCurrentViewController view]]; [[myCurrentViewController view] setFrame: [myTargetView bounds]]; } - (void)restoreRootView { [[myCurrentViewController view] removeFromSuperview]; [myTargetView addSubview:vwRoot]; [[vwRoot setFrame:[myTargetView bounds]]; }
残念ながら、restoreRootView
が呼び出されると、NSViewController
のビューは削除されますが、ルート ビューは表示されません。