【问题标题】:Differentiating between new documents and restored documents in a Cocoa application区分 Cocoa 应用程序中的新文档和恢复的文档
【发布时间】:2013-06-16 03:17:36
【问题描述】:

在我的项目中,我需要能够区分用户创建的文档和在应用程序启动时由 restoreStateWithCoder 恢复的文档之间的区别,因为对于新文档需要做一些事情,而不是恢复的文档。我该怎么做?

【问题讨论】:

    标签: cocoa nswindow document-based


    【解决方案1】:

    如何子类化“NSDocument”并将该子类用于您的文档?

    然后,您可以捕获“restoreStateWithCoder”,并为那些从磁盘恢复且未通过“文件 -> 新建”命令重新创建的文档设置唯一标志(例如 BOOL 属性)。

    您也可以尝试"method swizzle"restoreStateWithCoder”,但您必须决定在哪个对象中设置什么属性。

    【讨论】:

    • 我已经在使用项目附带的 NSDocument 子类并实现 restoreStateWithCoder 以实现自定义恢复指令。问题是原始帖子中提到的准备操作发生在 windowControllerDidLoadNib 中,这发生在恢复之前,使任何自定义标志都没有实际意义。
    • 你在做什么,为什么你不能禁用或隐藏它们,一旦你意识到文件已经恢复并且不是全新的?
    • 该应用程序实际上是一个网络浏览器,所以即使我使用的是多文档架构,也没有真正的文档。我正在使用 windowControllerDidLoadNib 在打开新窗口时创建一个新选项卡,并且可以根据用户偏好加载主页。这与标签恢复冲突。恢复时我可以在创建后立即清除选项卡数组,但这似乎非常低效和浪费。
    【解决方案2】:

    [为 Swift 回答这个问题,但总体思路也适用于 Objective-C]

    当文档是全新的时,您通常会调用以下函数:

    convenience init(type tyepName: String) throws
    

    您可以在该函数中设置一个标志(例如 needSpecialHandling = true,一个最初初始化为 false 的变量)来说明您是否需要对此类情况进行一些特殊处理。

    然后在makeWindowControllers() 函数中使用该变量来触发调用特殊代码(如果是true),就像在windowControllerDidLoadNib 函数中调用它一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多