恢复嵌套的NSDocuments

时间:2019-02-02 08:18:58

标签: swift macos nsdocument state-restoration nswindowrestoration

我正在为MacOS开发类似Xcode的IDE。 IDE将打开源文件(实例为TextDocument),并有一个单独的项目文件(包含项目设置的ProjectDocument实例。这两个实例都是NSDocument的子类。

打开源文件后,WindowsController和contentViewController仍需要访问项目文件。

我最初解决此问题的方法是在TextDocument中添加一个var project: ProjectDocument?属性。让每一个源文件的指针项目文件。视图控制器的representedObject属性设置为文本文档。

这在创建,打开和保存文件时很好用。

但是,重新打开应用程序后还原窗口并非完美无误。

正确还原了TextDocument(设置为representedObject),但project属性没有正确恢复。确实得到了保存,因为if coder.containsValue(forKey: "project")true方法中返回了restoreState(with coder: NSCoder),但是随后的self.project = coder.decodeObject(forKey: "project") as? ProjectDocument返回了nil。好像编码的格式与解码所期望的格式不同。

如果我更改ProjectDocument使其继承自NSObject而不是NSDocument,则项目会正确还原。

所以问题似乎是在编码NSDocument实例。

我也尝试过将项目文件存储为视图控制器的单独属性,但是存在相同的问题。某种程度上,NSDocuments似乎不喜欢被编码。

final class TextDocument: NSDocument {
    @objc var project: ProjectDocument? = nil

    override func encodeRestorableState(with coder: NSCoder) {
        coder.encodeConditionalObject(self.project, forKey: "project")
        super.encodeRestorableState(with: coder)
    }

    override func restoreState(with coder: NSCoder) {        
        super.restoreState(with: coder)
        if coder.containsValue(forKey: SerializationKey.project) {
            self.project = coder.decodeObject(forKey: "project") as? ProjectDocument // Is always nil
        }
    }
}

// NSDocument subclass can't be restored
final class ProjectDocument: NSDocument {

}

// NSObject subclass can.

final class ProjectDocument: NSObject, NSCoding {

}

我希望恢复project的{​​{1}}属性。不是

0 个答案:

没有答案