Из этого вопроса и вашего связанного вопроса о 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 будут в наличии. Так что это один из вариантов.