我有一個NSWindowController
它包含根視圖。根視圖有4 NSButtons
,一些文字和圖像。每個按鈕都綁定到NSViewController
。當我點擊其中一個按鈕時,根視圖被刪除,並且視圖被綁定到NSViewController
(我們稱之爲子視圖)。在子視圖中,有一個NSButton
,它向窗口控制器發送通知以恢復根視圖。這裏是我的代碼(我刪除了大部分的無用部分)恢復之前刪除的NSView
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
的視圖被刪除,但不顯示根視圖。
取消選中「使用自動佈局」修復它,謝謝!關於約束代碼,我只需要在自動佈局打開時添加它,對嗎?我應該不使用自動佈局? – b1onic
是的,只有當您保留自動佈局時才需要,否則您的代碼就可以。 Autolayout是Cocoa中一個相對較新的功能;使用它與否取決於你:如果你只需要一個基本的界面,你可以禁用它,但是它的強大和快速設置(當你瞭解它的工作原理時),你可以真正利用它。所以先看一下文檔。 –