0

xibを備えた1つのメインウィンドウコントローラーでココアアプリケーションを構築しています。その xib には、多くのカスタム ビュー クラスが含まれています。xib に NSViewController を追加したいのですが、問題が発生しています。

インターフェイス ビルダーでは、NSViewController を xib にドラッグし、それにカスタム コントローラー クラスを割り当て、そのビューを xib の適切なビューに割り当てることができます。問題は次のとおりです。initWithNibName:Bundle:またはloadViewが呼び出されません。

私は何が欠けていますか?

編集: 人々は質問を誤解しているようですので、明確にします。

ウィンドウにはすでにView Controllerがあります。私がやろうとしているのは、いくつかのサブビューに個別のビュー コントローラーを割り当てることです。NSViewControllerサブクラスを適切なNSViewサブクラス (メイン ウィンドウの子)に関連付ける方法を知る必要があります。

つまり、複数のNSViewControllerサブクラスを使用して、1 つの .xib ファイル内でさまざまなカスタム ビュー (それぞれ 1 つ) を制御しようとしています。これらのコントローラーとサブビューには、最終的に同じウィンドウに表示される独自の .xibs があります。

4

2 に答える 2

1

私が NSViewController に使用するパターンは、View Controller ごとに xib を持つことです。次に、そのView Controllerが必要なときにalloc、メソッドを使用しinitWithNibName:Bundle: ます。ビューを使用するとすぐに、loadViewが呼び出されます。

例:

self.editViewController = [[[MyEditViewController alloc] initWithNibName:@"MyEditViewController" bundle: nil] autorelease];
[self.window setContentView: editViewController.view];
于 2012-02-05T00:59:49.740 に答える
0

私もそれで行き詰まり、そのことをあきらめました-IBパレットからの白い縁取りのビューを持つ青い円。コードからコントローラーを作成し、ファイル所有者を介して所有するコントローラー クラスへの参照のみを IB に設定します。ファイル所有者を右クリックし、ID インスペクターにクラス名を入力してから、ファイルの所有者ビューから見る。

コードでは、適切な初期化ポイントで次のことを行います。

[self setMyViewController = [[MyViewController alloc] initWithNibName: @"MyView" bundle: [NSBundle mainBundle]]

特定のケースでwindowDidLoadは、ウィンドウがペン先からロードされ、作業の準備ができているときに、これが実行中になる可能性があります。次に、そのビューを Windows コンテンツ ビューに追加できます。また、ビューとビュー コントローラーの間に 1:1 の関係を持たせることを検討することもできます。メンテナンスの面で、生活がずっと楽になります。

編集: @pcperini がコメントで示唆しているように、パレット コンポーネントを使用できますが、コードでコントローラーをインスタンス化する必要があります。パレット コンポーネントを使用する場合は、メイン コントローラーまたは AppDelegate でプロパティを作成します。

@property (...) MyViewController *myViewController;

実際にコントローラーを作成するコード行を追加します (上記を参照)。次に、バインディング インスペクターを使用して、パレット コンポーネントをmyViewControllerプロパティにバインドします。

したがって、あなたが見逃しているのは、実際にはコントローラー オブジェクトをインスタンス化していないということです。

編集 2: コードは次のとおりです (awakeFromNib はトップ コントローラーのメソッドです)。それぞれが異なるサブビューを処理する 2 つの子コントローラーを作成します。

- (void) awakeFromNib {

    [[self startEndTopicHeader] setHeader: @"Event timeline boundary"];
    [[self startDateHeaderView] setHeader: @"Event (start) date"];
    [[self endDateHeaderView] setHeader: @"Event end date"];

    [self setStartDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]];
    [[[self startDateViewController] view] setFrame: [[self dummyStartView] bounds]];
    [[self dummyStartView] addSubview: [[self startDateViewController] view]];
    [[self startDateViewController] setParentController: self];

    [self setEndDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]];
    [[[self endDateViewController] view] setFrame: [[self dummyEndView] bounds]];
    [[self dummyEndView] addSubview: [[self endDateViewController] view]];
    [[self endDateViewController] setParentController: self];

}
于 2012-02-05T01:01:34.890 に答える