web-dev-qa-db-ja.com

NSViewControllerとペン先からの複数のサブビュー

InterfaceBuilderとNSViewControllerを使用してビューをロードすることに頭を悩ませるのに苦労しています。

私の目標は、次の説明を満たすビューを作成することです。ビューの幅全体に広がる上部のトップバー(ツールバーのようですが、正確ではありません)と、その下の2番目の「コンテンツビュー」。この複合ビューは、私のNSViewControllerサブクラスによって所有されています。

これにはInterfaceBuilderを使用するのが理にかなっています。ビューペン先を作成し、それに2つのサブビューを追加して、適切にレイアウトしました(トップバーとコンテンツビューを使用)。 File's OwnerMyViewControllerに設定し、コンセントなどを接続しました。

ロードしたいビュー(バーとコンテンツ)も独自のペン先にあり(これが私をつまずかせる可能性があります)、それらのペン先には、該当する場合、それぞれのNSViewサブクラスに設定されたカスタムクラスがあります。 File's Ownerとして何を設定すればよいかわかりません(所有者であるはずなのでMyControllerを推測しています)。

残念ながら、MyViewControllerのインスタンスを初期化すると、実際にはどのペン先も表示されません。私はそれをウィンドウのcontentViewに適切に追加しました(他の方法でチェックしました)、そして実際には、物事は一種の負荷です。つまり、awakeFromNibはバービューに送信されますが、ウィンドウには表示されません。私は間違いなくどこかでいくつかのワイヤーが交差していると思います。おそらく誰かが私の欲求不満の一部を和らげるために手を貸すことができますか?

[〜#〜] edit [〜#〜]私がしていることを示すコード

アプリケーションの起動が完了すると、アプリデリゲートからコントローラーが読み込まれます。

MyController *controller = [[MyController alloc] initWithNibName:@"MyController" bundle:nil];
[window setContentView:[controller view]];

そして、私のinitWithNibNameでは、今のところsuperを呼び出す以外に何もしません。

25
jbrennan

各ビューを独自のペン先に分割し、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
71
Brian Webster

MainViewControllerをNSWindowControllerのサブクラスにすべきではありませんか?そして、MainMenu.xibのメインウィンドウのビュー要素に接続されているクラスのアウトレット?古いスレッドがまだ読まれていることを願いましょう...

2
robject