我正在为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}}属性。不是