このメソッドは、ドキュメントベースのアプリがある場合に存在します。を参照してくださいNSDocument
。その場合NSDocument
、NIBファイルの所有者のインスタンスを作成します(メソッドNSDocument
はあります-setWindow:
が、ゲッターはありません)。コントローラは、ドキュメントインスタンスからウィンドウを認識します。コードは大まかに次のようになります。
NSDocument * document = ...;
NSWindowController * winCtrl = [[NSWindowController alloc]
initWithWindowNibName:@"SomeNib" owner:document];
[document addWindowController:winCtrl];
[winCtrl loadWindow];
これで、ドキュメントはNIBファイルの所有者になりますが、ウィンドウコントローラは、ドキュメントに割り当てられているウィンドウへの参照を引き続き受け取ります。
もちろん、このコードはデモンストレーションのみを目的としています。実際には、必要なすべてのコントローラーをサブクラス化してNSDocument
オーバーライドし、開始するのが正しい方法です。makeWindowControllers
ドキュメントに常に単一のNIBファイルからの単一のウィンドウしかない場合は、NSDocument
プロパティをNIBファイルの名前に設定してから、デフォルトの実装をwindowNibName
呼び出すこともできます。これにより、おおまかに次のようになります。makeWindowControllers
NSWindowController * winCtrl = [[NSWindowController alloc]
initWithWindowNibName:self.windowNibName owner:self];
[self addWindowController:winCtrl];
また、GNUStepの実装を確認してくださいNSWindowController
。これはAppleのものとは異なる場合があります(Appleのものはオープンソースではないため、わかりません)が、動作は同じである必要があります。
- (void) loadWindow
{
NSDictionary *table;
if ([self isWindowLoaded])
{
return;
}
table = [NSDictionary dictionaryWithObject: _owner forKey: NSNibOwner];
if ([NSBundle loadNibFile: [self windowNibPath]
externalNameTable: table
withZone: [_owner zone]])
{
_wcFlags.nib_is_loaded = YES;
if (_window == nil && _document != nil && _owner == _document)
{
[self setWindow: [_document _transferWindowOwnership]];
}
else
{
// The window was already retained by the NIB loading.
RELEASE(_window);
}
}
else
{
if (_window_nib_name != nil)
{
NSLog (@"%@: could not load nib named %@.nib",
[self class], _window_nib_name);
}
}
}
ソース: https ://github.com/gnustep/libs-gui/blob/master/Source/NSWindowController.m
プライベートメソッドを使用してドキュメントからウィンドウを取得しますが_transferWindowOwnership
、ロード後にウィンドウが設定されていない場合にのみ、ドキュメントが設定され、このドキュメントがロードされたNIBファイルの所有者として設定されます。