Col*_*las 2 macos cocoa autosave nsdocument
我有一个NS(Persistent)Document.
我通过Xcode运行我的应用程序,然后创建一个新文档(没有任何数据),然后退出我的应用程序.在这种情况下,我可以检查init和windowControllerDidLoadNib:被调用
如果我使用Xcode重新运行我的应用程序,那么之前的文档将自动打开.但是,我可以检查既init不会也不会windowControllerDidLoadNib:被调用.
为什么会这样?
你所看到的是窗户修复.正如该文档(基于文档的应用程序编程指南的一部分)所说:
文档体系结构在窗口恢复过程中实现以下步骤; 这些步骤与图5-2中显示的数字相关:
- 该
NSWindowController方法setDocument:将文档窗口的恢复类设置为共享NSDocumentController对象的类.NSWindow只要状态发生变化,该对象就会使其可恢复状态无效invalidateRestorableState.- 在下一个适当的时间,Cocoa向窗口发送
encodeRestorableStateWithCoder:消息,窗口将标识和状态信息编码到传入的编码器中.
当系统重新启动时,Cocoa重新启动应用程序并将
restoreWindowWithIdentifier:state:completionHandler:消息发送到NSApp对象.应用程序可以覆盖此方法以执行窗口还原所需的任何常规工作,例如替换新的还原类或从单独的包中加载它.
NSApp解码恢复类为窗口,发送该restoreWindowWithIdentifier:state:completionHandler:消息到恢复类对象[在这种情况下,文档控制器类-Peter],然后返回YES.- 恢复类重新打开文档并找到其窗口.然后它以窗口作为参数调用传入的完成处理程序.
- 可可发送的
restoreStateWithCoder:消息的窗口,它从传入的解码其可恢复状态NSCoder对象,并恢复它的内容的细节.[图5-2和一段解释视图,其他响应者和文档也被保存和恢复]
当应用程序重新启动时,Cocoa
restoreStateWithCoder:依次将消息发送到相关对象:首先是NSApplication对象,然后是每个NSWindow对象,然后是NSWindowController对象,然后是NSDocument对象,然后是每个已保存状态的视图.
窗口恢复协议也用于非文档相关的窗口,但文档机器为您处理大部分脏工作.如果您需要在窗口恢复的任何一侧(可能是两侧)执行任何操作,请覆盖encodeRestorableStateWithCoder:并restoreStateWithCoder:在文档中.前者是保存瞬时信息(如选择)的地方,后者是您在复活的文档及其窗口中恢复该信息的位置.
编码器的存在意味着文档是使用initWithCoder:而不是初始化init,尽管这不是您应该依赖的文档事实(在窗口恢复的上下文中).
| 归档时间: | 
 | 
| 查看次数: | 835 次 | 
| 最近记录: |