为什么在自动保存文档自动打开时调用init和windowControllerDidLoadNib:方法?

Col*_*las 2 macos cocoa autosave nsdocument

我有一个NS(Persistent)Document.

我通过Xcode运行我的应用程序,然后创建一个新文档(没有任何数据),然后退出我的应用程序.在这种情况下,我可以检查initwindowControllerDidLoadNib:被调用

如果我使用Xcode重新运行我的应用程序,那么之前的文档将自动打开.但是,我可以检查既init不会也不会windowControllerDidLoadNib:被调用.

为什么会这样?

Pet*_*sey 7

你所看到的是窗户修复.正如该文档(基于文档的应用程序编程指南的一部分)所说:

文档体系结构在窗口恢复过程中实现以下步骤; 这些步骤与图5-2中显示的数字相关:

  1. NSWindowController方法setDocument:将文档窗口的恢复类设置为共享NSDocumentController对象的类.NSWindow只要状态发生变化,该对象就会使其可恢复状态无效invalidateRestorableState.
  2. 在下一个适当的时间,Cocoa向窗口发送encodeRestorableStateWithCoder:消息,窗口将标识和状态信息编码到传入的编码器中.
  3. 当系统重新启动时,Cocoa重新启动应用程序并将restoreWindowWithIdentifier:state:completionHandler:消息发送到NSApp对象.

    应用程序可以覆盖此方法以执行窗口还原所需的任何常规工作,例如替换新的还原类或从单独的包中加载它.

    NSApp解码恢复类为窗口,发送restoreWindowWithIdentifier:state:completionHandler:消息到恢复类对象[在这种情况下,文档控制器类-Peter],然后返回YES.

  4. 恢复类重新打开文档并找到其窗口.然后它以窗口作为参数调用传入的完成处理程序.
  5. 可可发送restoreStateWithCoder:消息的窗口,它从传入的解码其可恢复状态NSCoder对象,并恢复它的内容的细节.

[图5-2和一段解释视图,其他响应者和文档也被保存和恢复]

当应用程序重新启动时,Cocoa restoreStateWithCoder:依次将消息发送到相关对象:首先是NSApplication对象,然后是每个NSWindow对象,然后是NSWindowController对象,然后是NSDocument对象,然后是每个已保存状态的视图.

窗口恢复协议也用于非文档相关的窗口,但文档机器为您处理大部分脏工作.如果您需要在窗口恢复的任何一侧(可能是两侧)执行任何操作,请覆盖encodeRestorableStateWithCoder:restoreStateWithCoder:在文档中.前者是保存瞬时信息(如选择)的地方,后者是您在复活的文档及其窗口中恢复该信息的位置.

编码器的存在意味着文档是使用initWithCoder:而不是初始化init,尽管这不是您应该依赖的文档事实(在窗口恢复的上下文中).