この質問とNSArrayControllersに関する関連する質問から、次のようなことをしていることがわかります。
- (void)makeWindowControllers
{
MyWindowController* wc = [[[MyWindowController alloc] initWithWindowNibName: [self windowNibName]] autorelease];
[self addWindowController: wc];
}
これを行う-windowControllerDidLoadNib:
と、呼び出されません。そのように初期化した場合、NSDocumentオブジェクトはNibの所有者ではないためです。あなたNSDocument.h
が見ると、次のコメントが表示されます(追加の強調を参照):
/* Create the user interface for this document, but don't show it yet. The
default implementation of this method invokes [self windowNibName],
creates a new window controller using the resulting nib name (if it is
not nil), **specifying this document as the nib file's owner**, and then
invokes [self addWindowController:theNewWindowController] to attach it.
You can override this method to use a custom subclass of
NSWindowController or to create more than one window controller right
away. NSDocumentController invokes this method when creating or opening
new documents.
*/
- (void)makeWindowControllers;
代わりに、次のようにします。
- (void)makeWindowControllers
{
MyWindowController* wc = [[[MyWindowController alloc] initWithWindowNibName: [self windowNibName] owner: self] autorelease];
[self addWindowController: wc];
}
-windowControllerDidLoadNib:
私はあなたがそれが再び呼ばれるのを見つけると信じています。そのNibの所有者がNSDocumentでないという正当な理由がある場合、それは役に立たないかもしれませんが、それ-windowControllerDidLoadNib:
が呼び出されない理由であり、その動作を取り戻すために何ができるかです。これは、initよりもフェッチを実行するのにほぼ確実に適した場所です。これは、必要なCoreDataサポートがすべて配置される前に発生する可能性があります。これが1つのオプションです。