2009-11-12 22 views
25

Interface BuilderとNSViewControllerを使用してビューを読み込むのが難しいです。NSViewControllerとNibからの複数のサブビュー

私の目標は、ビューの全幅にまたがる上部(ツールバーのように正確ではない)のトップバーと、下の2番目の「コンテンツビュー」です。この複合ビューは私のNSViewControllerサブクラスが所有しています。

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

読み込みたいビュー(バーとコンテンツ)も独自のペン先に表示されています(これは私の邪魔になるかもしれません)。ペン先のカスタムクラスはそれぞれ該当するNSViewサブクラスに設定されています。私は彼らのFile's Owner(私はMyControllerがその所有者であるべきであると推測していると思います)として何を設定するのか分かりません。

悲しいかな、MyViewControllerのインスタンスを初期化すると、実際には表示されません。私はそれを私のWindowのcontentViewに正しく追加しました(私はそれ以外の点をチェックしました)。つまり、awakeFromNibがバービューに送信されますが、ウィンドウには表示されません。私は間違いなくどこかの電線が交差していると思う。おそらく誰かが私の欲求不満の一部を和らげるために手を貸すことができたでしょうか?

EDIT私は自分のアプリケーションは、アプリケーションデリゲートから、起動が完了したとき、コントローラがロードされる

をやっているかを示すためにいくつかのコード:私initWithNibName Iドン」で

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

そして、何もしませんが、今はスーパーに電話してください。

+0

コードを投稿してください。ビューコントローラをどのように初期化するかははっきりしません。 –

答えて

71

各ビューを独自のペン先に分割し、NSViewControllerを使用する場合、典型的な処理方法は、各ペン先のサブクラスをNSViewControllerにすることです。それぞれのnibファイルのFile's Ownerはそのサブクラス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 
+0

魅力的な作品です。例と徹底した説明をお寄せいただきありがとうございます! – jbrennan

+0

ありがとう、これは非常に役に立ちました。 ++ – ttvd

2

ですMainViewControllerをNSWindowControllerのサブクラスにしてはいけませんか?そして、クラスのアウトレットはMainMenu.xibのメインウィンドウの要素を表示するために接続されていますか? 古いスレッドがまだ読み込まれることを望みましょう...

+1

これは必要ではありません。私の意見では、ウィンドウ全体のコンテンツビューを管理するビューコントローラからウィンドウコントローラを分離することも良い方法です。ウィンドウには、ビューよりも多くの部品と機能があります(対応するビューコントローラを使用)。 –

関連する問題