2011-11-07 13 views
1

ココアMacOSXの中にプログラムでビューを作成する方法 私の質問は、私は、カスタムクラスを持つビュー名は、私は、nibファイル「MyNib」でビュー「MYVIEW」を作成しました

を使用してNSViewのオブジェクトを作成する方法です私のWindowControllerのために。 Interface Builderの使用mywindowControllerクラスでコンセントを作成することはできません。

インタフェースビルダを使用してコンセントを作成する方法がないのであれば、NSViewのを作成するための他の方法は何ですか。事前

答えて

1

おかげで、あなたがdocumentationを読みましたか? nibs/xibsを読み込むときは、File's Owner(xibのトップレベルオブジェクト)を指定する必要があります。つまり、所有者が目的のアウトレットを持っていなければならないので、どのオブジェクトを渡すかを意味します。

BOOL success = [NSBundle loadNibNamed:@"MyNib" owner:selfOrSomeControllerWithOutlets]; 

これはxibの内容を読み込んで、指定した所有者に接続する最も簡単な方法です。

コントローラーインスタンスを作成し、そのxibを一度に読み込むこともできます。一例として、ビュー/ビュー・コントローラは、メイン・ウィンドウ・コントローラによってロードされてもよい。ウィンドウコントローラの内部では、あなたが(それがWidgetView.xib内部ビューをロードする)これを行う方法-widgetViewがある可能性があります。この場合

- (NSView *)widgetView 
{ 
    if (!_widgetViewController) 
     _widgetViewController = [[MyWidgetViewController alloc] initWithNibName:@"WidgetView" bundle:nil]; 
    return [_widgetViewController view]; 
} 

を、MyWidgetViewControllerはそれを-viewプロパティを与えるNSViewControllerサブクラス(ありますxib内のFile Ownerのクラス名はMyWidgetViewControllerに設定され、ビューコンセントはメインコンテナビューに接続されます。コントローラがxibで正常に初期化されると、-viewあなたのサブクラスが持っている他のコンセントが再接続され、コントローラーがxibのコンテンツに接続されたとき

初めて-widgetViewを要求すると、xibと手ビューを戻す(またはゼロ)。それ以降の呼び出しでは、既にロードされているビューが戻されます。これは「レイジーローディング」と呼ばれ、通常は常に使用されるわけではないビューのための最良の方法です。複数の「コピー」に対してこれを行うこともできます。作成されたときにコンテナに各ビューコントローラを追加し、必要に応じて管理します。 (:バンドルは:nilを返します。その場合-initWithNibNameに)、あなたはそれを行うべきではありません。もちろん、

上記のコードは、XIBが見つからなかったという可能性を無視します。間違いなくNSAssert ...()を使用してエラーを処理し、優雅に終了します(xibが見つからない場合、アプリのバンドルに問題がある可能性が高いため)。

+0

nice for explanaion – user970251

関連する問題