InterfaceBuilderとNSViewControllerを使用してビューをロードすることに頭を悩ませるのに苦労しています。
私の目標は、次の説明を満たすビューを作成することです。ビューの幅全体に広がる上部のトップバー(ツールバーのようですが、正確ではありません)と、その下の2番目の「コンテンツビュー」。この複合ビューは、私のNSViewController
サブクラスによって所有されています。
これにはInterfaceBuilderを使用するのが理にかなっています。ビューペン先を作成し、それに2つのサブビューを追加して、適切にレイアウトしました(トップバーとコンテンツビューを使用)。 File's Owner
をMyViewController
に設定し、コンセントなどを接続しました。
ロードしたいビュー(バーとコンテンツ)も独自のペン先にあり(これが私をつまずかせる可能性があります)、それらのペン先には、該当する場合、それぞれのNSViewサブクラスに設定されたカスタムクラスがあります。 File's Owner
として何を設定すればよいかわかりません(所有者であるはずなのでMyController
を推測しています)。
残念ながら、MyViewController
のインスタンスを初期化すると、実際にはどのペン先も表示されません。私はそれをウィンドウのcontentViewに適切に追加しました(他の方法でチェックしました)、そして実際には、物事は一種の負荷です。つまり、awakeFromNib
はバービューに送信されますが、ウィンドウには表示されません。私は間違いなくどこかでいくつかのワイヤーが交差していると思います。おそらく誰かが私の欲求不満の一部を和らげるために手を貸すことができますか?
[〜#〜] edit [〜#〜]私がしていることを示すコード
アプリケーションの起動が完了すると、アプリデリゲートからコントローラーが読み込まれます。
MyController *controller = [[MyController alloc] initWithNibName:@"MyController" bundle:nil];
[window setContentView:[controller view]];
そして、私のinitWithNibNameでは、今のところsuperを呼び出す以外に何もしません。
各ビューを独自のペン先に分割し、NSViewController
を使用する場合、物事を処理する一般的な方法は、ペン先ごとにNSViewController
サブクラスを作成することです。次に、それぞれのnibファイルのファイルの所有者がそのNSViewController
サブクラスに設定され、view
アウトレットをnibのカスタムビューに接続します。次に、メインウィンドウのコンテンツビューを制御するビューコントローラーで、各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
MainViewControllerをNSWindowControllerのサブクラスにすべきではありませんか?そして、MainMenu.xibのメインウィンドウのビュー要素に接続されているクラスのアウトレット?古いスレッドがまだ読まれていることを願いましょう...