2009-11-12 7 views
25

Interface Builder와 NSViewController를 사용하여보기를로드하는 데 어려움을 겪고 있습니다.NSViewController와 Nib의 여러 서브 뷰

내 목표는 아래 설명과 일치하는보기를 만드는 것입니다. 상단의 상단 바 (툴바와 같지만 정확히는 아님)는보기의 전체 너비와 아래의 두 번째 '콘텐츠보기'입니다. 이 합성보기는 내 NSViewController 하위 클래스가 소유합니다.

인터페이스 빌더를 사용하는 것이 좋습니다. 나는보기 펜촉을 만들었고 두 개의 하위보기를 추가했다. (위쪽 막대와 내용보기를 사용하여) 제대로 배치했다. File's OwnerMyViewController으로 설정하고 콘센트 등을 연결했습니다.

내가로드하고 싶은 뷰 (바 및 컨텐츠)도 자신의 닙에 있습니다.이 탬 부스는 나를 감추고 있을지도 모릅니다. 그리고 그 닙의 커스텀 클래스는 적용 가능한 NSView 서브 클래스로 설정되어 있습니다. 내가 그들의 File's Owner (나는 그들의 소유자가되어야하므로 MyController을 추측하고있다)로 무엇을 설정할 지 확신하지 못한다.

아아, 내가 MyViewController의 인스턴스를 초기화 할 때 아무 것도 실제로 표시되지 않습니다. 나는 윈도우의 contentView에 제대로 추가했다. (나는 그렇지 않다), 실제로는 일종의로드를 체크했다. 즉, awakeFromNib은 막대보기로 보내지지만 창에는 표시되지 않습니다. 나는 분명히 어딘가에 몇 개의 전선이 교차되어 있다고 생각한다. 아마도 누군가 내 좌절감을 덜어 줄 수 있을까요?

편집 일부 코드 내가 뭘하는지 보여

내 응용 프로그램이 실행 완료되면 컨트롤러가 애플 대리자에서,로드 : 내 initWithNibName 나는 돈에 다음

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

그리고 ' 아무것도하지 마라. 지금은 슈퍼에게 전화한다.

+0

코드를 게시하십시오. 뷰 컨트롤러를 어떻게 초기화하는지는 명확하지 않습니다. –

답변

71

각보기를 고유 한 펜촉으로 분리하고 NSViewController을 사용할 때 일반적인 처리 방법은 각 펜촉에 대해 NSViewController 하위 클래스를 만드는 것입니다. 각각의 nib 파일에 대한 File 's Owner는 서브 클래스 NSViewController으로 설정되며, 펜촉의 사용자 정의보기에 view 콘센트를 연결합니다. 그런 다음 기본 창 컨텐츠보기를 제어하는보기 제어기에서 각 NSViewController 서브 클래스의 인스턴스를 인스턴스화 한 다음 해당 제어기의보기를 창에 추가하십시오.

코드의 빠른 비트 -이 코드에서, 나는 메인 컨텐츠 뷰 컨트롤러 MainViewController를 호출하고있어에서 "도구 모음"에 대한 컨트롤러는 TopViewController이며, 컨텐츠의 나머지는 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

매력처럼 작동합니다. 예제와 철저한 설명에 감사드립니다! – jbrennan

+0

감사합니다. 이것은 매우 도움이되었습니다. ++ – ttvd

2

입니다 MainViewController가 NSWindowController의 서브 클래스가 아니어야합니까? 그리고 클래스의 콘센트는 MainMenu.xib의 메인 윈도우에있는 뷰 요소에 연결되어 있습니까? 오래된 스레드가 여전히 읽히길 바래 ...

+1

필요하지 않습니다. 제 생각에는 전체 윈도우의 내용보기를 관리하는보기 컨트롤러에서 창 컨트롤러를 분리하는 것이 좋습니다. 윈도우는보기보다 많은 부분과 기능을 가지고 있습니다 (해당보기 컨트롤러 포함). –

관련 문제