2010-07-17 5 views
2

이것은 사실 두 부분으로 된 질문입니다. 내 설명이 분명해지기를 바랍니다.NSViewController의 뷰 내용은 초기화 방법에 따라 다릅니다.

뷰의 일부에서 다른 사용자 정의보기를 표시하도록 구성 할 수있는 NSViewController가 있습니다. 예를 들어 해당 뷰는 CustomViewA 또는 CustomViewB 중 하나를 표시 할 수 있습니다.

각 사용자 지정보기에 대해 NSViewController를 만들고 CustomViewA를 처리하는 NSViewController 또는 CustomViewB를 처리하는 NSViewController로 MyViewController를 초기화하여이 작업을 수행 할 수있었습니다. NSBox를 사용하고 주어진 NSViewController가 제공하는 뷰에 contentView를 설정합니다.

이 접근법의 문제점은 contentView가 "MyView"를 보유하고 NSView 내부에 CustomViewA 또는 CustomViewB를 보유 할 다른 NSBox를 보유한다는 것입니다.

또 다른 문제점은 MyViewController가 CustomViewA와 CustomViewB를 처리하고 각각에 대해 별도의 NSViewController를 가지고 있지 않다는 것입니다. 여기

내 현재 솔루션의 샘플 코드입니다 :

// How I initialize the NSViewControllers 
CustomViewControllerA* cvc = [[CustomViewControllerA alloc] initWithNibName:@"CustomViewA" bundle:nil]; 
MyViewController* controller = [[MyViewController alloc] initWithCustomViewController:cvc nibName:@"MyView" bundle:nil]; 

//... 

// In Controller of main view 
- (void)awakeFromNib 
{ 
    // container is an NSBox* 
    [self.container setContentView:[self.myViewController view]]; 
} 

//... 

// In MyViewController 
-(void)awakeFromNib 
{ 
    // content is an NSBox* 
    [self.content setContentView:[self.customViewController view]]; 
} 

어떻게 할 수 있습니다 내 라이브 MyView.nib 그들 모두 자신의 컨트롤러로 MyViewController를 사용하여 내부 CustomViewA 및 CustomViewB?

NSBox 대신 기본보기에서 MyView를 유지하려면 어떻게해야합니까?

미리 감사드립니다.

// In MyViewController.m 
- (void) awakeFromNib { 
    [self.view addSubview:[self.customViewController.view]]; 
} 

을하고 MyViewController과 같은 매개 변수를해야합니다 :

답변

0

이 시도

// In MyViewController.h 
@interface MyViewController : NSViewController { 
    IBOutlet NSViewController* customViewController; 
} 
+0

감사합니다. 하나의 질문 비록 ... 사용자가 단추를 클릭하면 MyViewController가보기를 교체합니다. 난 단지 NSBox setCustomView 함께 이렇게하는 방법을 알고 : 이 방법은 어떻게 사용자의 클릭하면보기를 바꿀 수 있습니까? [self.view addSubview : ...]를 다시 호출 하시겠습니까? –

+0

다소 차이가 있습니다.addSubview를 다시 호출 할 수 있지만 추가 한 원래 하위 뷰에서 [NSView removeFromSuperview]를 호출해야합니다. –

2

가 여기에 내가 아마이 설정에 대한 갈 것이 방법입니다.

@interface MyViewController : NSViewController 
{ 
    IBOutlet NSView* customView; //initially points to an NSBox or generic custom view from the nib file 
    CustomViewControllerA* viewControllerA; 
    CustomViewControllerB* viewControllerB; 
} 

@end 

@implementation MyViewController 

- (void)switchToCustomViewController:(NSViewController*)newCustomViewController 
{ 
    //Make sure the subview gets put in the right location 
    [newCustomViewController.view setFrame:customView.frame]; 
    [self.view replaceSubview:customView withView:newCustomViewController.view]; 
    customView = newCustomViewController.view; 
} 

//I usually use loadView in NSViewControllers rather than awakeFromNib, but either works 
- (void)loadView 
{ 
    [super loadView]; 
    viewControllerA = [[CustomViewControllerA alloc] initWithNibName:@"CustomViewA" bundle:nil]; 
    viewControllerB = [[CustomViewControllerB alloc] initWithNibName:@"CustomViewB" bundle:nil]; 
    [self switchToCustomViewController:viewControllerA]; 
} 

@end 

그래서, 오히려 NSBox 내부의 사용자 정의보기를 넣는 것보다,이 설정은 사용자 정의보기 중 하나로 전환 처음으로 제거됩니다 임시 자리로 펜촉에 포함 된 뷰를 가질 것이다. 그런 다음 전환하려는 컨트롤러로 -switchToCustomViewController:으로 전화하면됩니다. 그때부터 전환 할 때 MyViewController 뷰의 직접 하위 뷰로 다른 뷰에 대한 하나의 사용자 정의 뷰를 스와핑 할뿐입니다. 초기에 사용 된 것을 지정하려면, init 메소드 또는 MyViewController에 어떤 사용자 정의 뷰가 먼저 사용되어야하는지 알려주도록 설정할 수있는 단순 특성을 작성하십시오.

+0

팁 주셔서 감사. 이 방법을 사용하면 사용자 지정보기의 자동 크기 조정이 작동하지 않는다는 점만 제외하면 잘 작동합니다. 스위치를 토글하면 프레임을 설정하기 때문에 제대로 크기가 조정됩니다. 이는 뷰의 크기를 경청하고 매 프레임을 설정해야한다는 것을 의미합니까? 그렇다면 ... 사용자 정의보기를 NSBox의 contentView로 설정하면 크기 조정이 자동으로 작동합니다. 하위보기를 전환하는 대신 NSBox를 사용하고 contentView를 전환하는 것이 유리합니까? –

+0

내보기에 "Autoresizes Subviews"플래그가 켜져 있다는 것을 추가하고 싶습니다. Interface Builder에서 NSBox를 뷰에 추가하여 크기가 조정되는지 테스트했습니다. 프로그래밍 방식으로 추가 한 하위보기 만 자동으로 크기가 조정되지 않습니다. –

0

NSViewController는 실제로 스왑 아웃 및 스왑 된 여러 뷰를 처리하기위한 것이 아닙니다. 주로 Nib/Xib에서로드 된 단일 뷰를 처리하고 최상위 레벨 객체의 메모리를 관리하며 편리한 바인딩 기능을 제공합니다. 일반적인 사용 모델은 현재하고있는 것처럼 각 뷰에 대해 NSViewController를 서브 클래스 화하는 것입니다.

관련 문제