1

好的,我对 Cocoa 和 Objective-C 以及一般的 OOP 还很陌生。

作为背景,我正在开发一个可扩展的编辑器,它将用户的文档存储在一个包中。这当然需要一些“乐趣”来解决一些问题NSFileWrapper(即有点偷偷摸摸的编写和加载过程,以避免NSFileWrappers为包中的每个文档制作)。我得到的解决方案本质上是将我的NSDocument子类视为只是一个外壳——使用它来为捆绑包创建文件夹,然后将文档的实际内容传递给其他方法。

不幸的是,在某些时候,我似乎完全搞砸了狗。我不知道这是怎么发生的,但是关闭文档窗口不再释放文档。即使窗口成功关闭,文档对象似乎也没有收到“关闭”消息或任何相关消息。

最终结果是,如果我启动我的应用程序,创建一个新文档,保存它,然后关闭它,然后尝试重新打开它,文档窗口永远不会出现。通过一些创造性的子类化和NSLogging,我设法弄清楚文档对象仍在内存中,并且仍然附加到NSDocumentController实例,因此尝试打开文档从未通过NSDocumentController's“嗯,当前打开那个”检查。

我确实有一个NSWindowControllerNSDocumentController实例,但我已经完全从我的项目中清除了它们。我已经覆盖了几乎所有NSDocument试图找出问题所在的方法。据我所知,我的 Interface Builder 绑定都是正确的——主菜单中的“关闭”附加到performClose:第一响应者等,我也尝试过使用新的未受污染的 MainMenu 和 Document xibs。

我认为我的捆绑编写代码可能有些奇怪,所以我基本上将其全部删除并从头开始,但这似乎不起作用。我拿出我的-init方法覆盖,这也没有帮助。我在这里没有任何简单文档应用程序的来源,所以我没有尝试下一个合乎逻辑的步骤(在readFromUrlandwriteToUrl方法中用已知的工作代码替换我的代码)。

我已经在大约 16 个小时的不间断故障排除中遇到了这个问题,不用说,我已经走到了尽头。如果我想不通,我想我会从头开始尝试这个项目,使用更多的代码和基于捆绑文档混乱的强度。

4

1 回答 1

1

没有代码很难说,但我建议发送:

closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo:

... 到文档控制器,然后在控制器传递给委托时查看控制器以查看其状态如何变化。

如果控制器在您发送显式消息时关闭文档,那么您的问题在于绑定到窗口。

于 2010-04-25T15:59:29.003 回答