4

NSViewController からの 1 つのビューを持つ単純なウィンドウで構成される単純なプロジェクトがあります ( http://i.stack.imgur.com/UAn6L.pngを参照) 。

ここに画像の説明を入力

ビューは、カスタム ビュー コントローラー オブジェクトに管理されます (+ リンク、スクリーンショットを参照)。

ViewController オブジェクトを MainMenu.xib にドラッグし、ビュー アウトレットを接続して、Controller-Class + Nib-Name を設定しました。

アプリを起動すると、カスタム ビューがウィンドウに表示されません ("awakeFromNib" がカスタム NSViewController サブクラスで呼び出されます!)。

IB の詳細については、スクリーンショットを参照してください - > http://i.stack.imgur.com/UAn6L.png

私が見逃しているアイデアはありますか?

4

2 に答える 2

3

描かれていない名前の付いた別の Nib があると思いますCustomImageView(Xcode によって自動的に作成されたもの)。その場合、コントロールと描画コードを別の Nib のビューに追加します。ビュー コントローラーのビューを実際にウィンドウに追加するには、AppDelegate からビュー コントローラーへの IBOutlet 接続を作成し、ビューを追加するときに次のコードを追加して、プログラムで行う必要がありますapplicationDidFinishLaunching:

[viewController.view setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
[viewController.view setFrame:NSInsetRect([window.contentView bounds], 20, 20)];
[window.contentView addSubview:viewController.view];

これにより、スクリーンショットのように中央に配置されます。問題はview、MainMenu Nib で接続を作成することにより、別のCustomImageViewNib で接続をオーバーライドしていることです。ウィンドウの Custom View オブジェクトを削除できます...カスタム ビューをプログラムで追加する必要があります。そのように機能すればよいのですが、そうではありません。

編集:

ニブがアーカイブ解除される順序のためです。最初に CustomImageView がインスタンス化され、そのすべての接続が確立されます。この時点で、viewプロパティは正しく設定されています。次に、MainMenu はプロパティを再度フックし、別の Nib でプロパティをviewオーバーライドします。view現在、ビュー プロパティが正しく設定されていません。それは正常な動作です。別の nib を使用している場合は、それを未接続のままにして、View Controller のビューをコードに追加する必要があります。

別の方法は、別の Nib を使用しないことです。プロジェクトから削除し、ビューインウィンドウを設定して、接続をそのままにしておきます。これで、コードを追加することなく、それを管理する別のビュー コントローラーを持つことができます。ビューが非常に複雑な場合、またはユーザーがメインウィンドウに異なるビューを選択できる場合のように、必要に応じて遅延ロードしたい場合にのみ、別の Nib が必要です。

于 2011-12-24T19:55:05.787 に答える
1

あなたがiOSデバイス向けに開発していると思ったので、以前の回答を削除しました。今では、これが標準の Mac OS プロジェクトであることに気付きました。とにかく、最初のビューコントローラーの設定について私が言ったことは同じままです。わかりました、NSView オブジェクトを持つカスタム NSViewController オブジェクトがあります。ここまではかなり良いです。しかし、アプリは起動時にどのビューを表示するかをどのように知る必要がありますか。初期ビューを NSViewController のビューにするか、初期ビューコントローラーを NSViewController オブジェクト自体にする必要があります。これにより、開始時に何を表示するかがわかります。プロジェクトがそれほど単純である場合は、プロジェクトを見てみたいと思います。私のメールに送信してください。

于 2011-12-24T13:55:21.810 に答える