Cocoa -makeWindowController是初始化NSPersistentDocument的最佳位置吗?
使用Cocoa -makeWindowController是初始化NSPersistentDocument的最佳位置吗?,cocoa,core-data,nspersistentdocument,Cocoa,Core Data,Nspersistentdocument,使用NSPersistentDocument加载现有文档时,作为初始化的一部分,我想准备一些内容: NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"DocumentRoot"]; NSArray *results = [self.managedObjectContext executeFetchRequest:req error:NULL]; if (results.count) sel
NSPersistentDocument
加载现有文档时,作为初始化的一部分,我想准备一些内容:
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"DocumentRoot"];
NSArray *results = [self.managedObjectContext executeFetchRequest:req error:NULL];
if (results.count) self._docRoot = [results objectAtIndex:0];
当我将此代码放入-init
时,fetch请求不会返回任何结果
将视图控制器组件从我的NSPersistentDocument
子类重构为新的NSWindowController
子类时,我遇到了这个问题。我曾在-windowcontrolleridloadnib:
中处理此初始化,但不再调用它
如果我将代码从
-init
移动到-makeWindowControllers
,我会得到预期的结果。-makeWindowControllers
真的是准备这样内容的合适地方吗?如果代码不是从init调用的,那是因为您的文档正在其他地方初始化,例如initWithContentsOfURL:ofType:error:
,initForURL:withContentsOfURL:ofType:error:
,initWithType:error:
或initWithCoder:
MakeWindowController
不用于设置数据。尝试实现上述所有初始值设定项并记录,以查看调用的是哪个 如果代码不是从init调用的,这是因为您的文档正在其他地方初始化,例如initWithContentsOfURL:ofType:error:
,initForURL:withContentsOfURL:ofType:error:
,initWithType:error:
或initWithCoder:
makeWindowControllers
不是用于设置数据的。尝试实现上述所有初始值设定项并记录,以查看调用的是哪个 从这个问题和您关于NSArrayController的相关问题来看,我想您正在做这样的事情:
- (void)makeWindowControllers
{
MyWindowController* wc = [[[MyWindowController alloc] initWithWindowNibName: [self windowNibName]] autorelease];
[self addWindowController: wc];
}
执行此操作时,不会调用-windowcontrolleridloadnib:
,因为如果以这种方式初始化,NSDocument对象不是Nib的所有者。如果您查看NSDocument.h
,您将看到以下注释(请参阅添加的重点):
相反,如果您这样做:
- (void)makeWindowControllers
{
MyWindowController* wc = [[[MyWindowController alloc] initWithWindowNibName: [self windowNibName] owner: self] autorelease];
[self addWindowController: wc];
}
我相信您会发现再次调用了
-windowcontrolleridloadnib:
。如果您有充分的理由认为Nib的所有者不是NSDocument,那么这可能对您没有帮助,但这就是为什么没有调用-windowcontrolleridloadnib:
,您可以做些什么来恢复该行为。与init相比,这几乎肯定是一个更好的抓取位置,init很可能在所有必要的CoreData支持材料准备就绪之前发生。这是一个选择。从这个问题和您关于NSArrayController的相关问题中,我想您正在做这样的事情:
- (void)makeWindowControllers
{
MyWindowController* wc = [[[MyWindowController alloc] initWithWindowNibName: [self windowNibName]] autorelease];
[self addWindowController: wc];
}
执行此操作时,不会调用-windowcontrolleridloadnib:
,因为如果以这种方式初始化,NSDocument对象不是Nib的所有者。如果您查看NSDocument.h
,您将看到以下注释(请参阅添加的重点):
相反,如果您这样做:
- (void)makeWindowControllers
{
MyWindowController* wc = [[[MyWindowController alloc] initWithWindowNibName: [self windowNibName] owner: self] autorelease];
[self addWindowController: wc];
}
我相信您会发现再次调用了
-windowcontrolleridloadnib:
。如果您有充分的理由认为Nib的所有者不是NSDocument,那么这可能对您没有帮助,但这就是为什么没有调用-windowcontrolleridloadnib:
,您可以做些什么来恢复该行为。与init相比,这几乎肯定是一个更好的抓取位置,init很可能在所有必要的CoreData支持材料准备就绪之前发生。所以这是一个选择。根据我得到的回答,我认为我做的是正确的,所以这里是我对自己问题的回答
如果您使用的是NSPersistentDocument提供的核心数据堆栈,则无法在-init
中使用核心数据
相反,你应该:
-windowcontrolleridloadnib:
–或者如果使用自定义NSWindowController子类,则放入-makeWindowController
-setUpDocument
,并从-makeWindowControllers
/-WindowControllerIDloadNib:
调用该方法如果您使用的是普通NSDocument,或者您自己设置核心数据堆栈,那么您可以根据我得到的回答在
-init
中设置文档模型,我认为我做的是正确的,下面是我对自己问题的回答
如果您使用的是NSPersistentDocument提供的核心数据堆栈,则无法在-init
中使用核心数据
相反,你应该:
-windowcontrolleridloadnib:
–或者如果使用自定义NSWindowController子类,则放入-makeWindowController
-setUpDocument
,并从-makeWindowControllers
/-WindowControllerIDloadNib:
调用该方法如果您使用的是普通NSDocument,或者您自己设置核心数据堆栈,则可以在
-init
中设置文档模型,调用代码。问题不在于此。这是关于-init
中的“获取请求不返回结果”。很抱歉,我错了。(你原来的帖子对此并不清楚)。不过,这并不是否决的理由。我的问题是,“-makeWindowController是初始化NSPersistentDocument的最佳位置吗?”这一点在我最初的帖子中已经很清楚了。我想你是对的;也许没有我想的那么清楚。很抱歉如果你编辑你的帖子,我会删除投票。代码会被调用。问题不在于此。这是关于-init
中的“获取请求不返回结果”。很抱歉,我错了。(你原来的帖子不清楚