루트보기가 포함 된 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을 켠 상태에서만 필요합니다. 그렇지 않으면 코드가 정상입니다. Autolayout은 Cocoa의 비교적 새로운 기능입니다. 그것을 사용하거나 사용하지 않는 것은 당신에게 달렸습니다 : 기본 인터페이스 만 있으면 사용할 수 없지만 설정이 매우 강력하고 빠르며 (작동 원리를 배울 때) 실제로 활용할 수 있습니다. 먼저 문서를 살펴보십시오. –