2

これは実際には 2 つの部分からなる質問です。私の説明が明確であることを願っています。

ビューの一部に別のカスタム ビューを表示するように構成できる NSViewController があります。たとえば、そのビューは CustomViewA または CustomViewB のいずれかを表示できます。

カスタム ビューごとに NSViewController を作成し、CustomViewA を処理する NSViewController または CustomViewB を処理する NSViewController で MyViewController を初期化することで、これを機能させることができました。NSBox を使用し、その contentView を、指定された NSViewController によって提供されるビューに設定します。

このアプローチの問題は、contentView が「MyView」を保持する NSBox があり、「MyView」内に CustomViewA または CustomViewB を保持する別の NSBox があることです。

もう 1 つの問題は、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]];
}

CustomViewA と CustomViewB を MyView.nib 内に配置し、両方とも MyViewController をコントローラーとして使用するにはどうすればよいですか?

メイン ビューに NSBox ではなく MyView を保持させるにはどうすればよいですか?

前もって感謝します!

4

3 に答える 3

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のビューの直接のサブビューとして、一方のカスタムビューをもう一方のカスタムビューに交換するだけです。最初に使用するビューを指定できるようにする場合は、最初に使用するカスタムビューをMyViewControllerに指示するように設定できるinitメソッドまたは単純なプロパティを作成するだけです。

于 2010-07-17T23:39:11.740 に答える
0

これを試して:

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

MyViewController には次のようなパラメーターが必要です。

// In MyViewController.h
@interface MyViewController : NSViewController {
  IBOutlet NSViewController* customViewController;
}
于 2010-07-17T18:47:38.793 に答える
0

NSViewController は、スワップインおよびスワップアウトされる複数のビューを処理することを実際には意図していません。主に、Nib/Xib からロードされた単一のビューを処理し、トップレベル オブジェクトのメモリを管理し、便利なバインディング機能を提供するためのものです。典型的な使用モデルは、現在行っているように、ビューごとに NSViewController をサブクラス化することです。

于 2010-07-18T09:18:40.480 に答える