Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa -makeWindowController是初始化NSPersistentDocument的最佳位置吗?_Cocoa_Core Data_Nspersistentdocument - Fatal编程技术网

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
    中的“获取请求不返回结果”。很抱歉,我错了。(你原来的帖子不清楚