swift - 恢复嵌套的 NSDocuments
问题描述
我正在为 MacOS 开发类似 Xcode 的 IDE。IDE 打开源文件(的实例TextDocument
)并具有单独的项目文件(ProjectDocument
包含项目设置的实例。两者都是NSDocument
.
打开源文件时,WindowsController 和 contentViewController 仍然需要访问项目文件。
我最初解决这个问题的方法是var project: ProjectDocument?
向 TextDocument 添加一个属性。这样每个源文件都有一个指向项目文档的指针。视图控制器的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
财产。TextDocument
它不是
解决方案
推荐阅读
- swift - App 无法在真实的 iOS 设备上运行,但可以在模拟器上运行
- kendo-ui - 如何在控件外调用剑道列表框的内置功能
- yii2 - mpdf yii2 抛出错误 Undefined offset: 0 for tableLevel
- node-red - 红色节点用 [error] [function:check for lost changes] xx ERRORS 淹没 syslog
- mysql - mySQL:使用条件计算多个表中的唯一键
- c# - 工具提示中的长文本未在 UWP 中完全显示
- plc - B&R Automation Studio 避免在不同位置或机器上构建相同源代码时重新启动 PLC
- android - Kotlin .let {} 空安全
- browserstack - 在 BrowserStack 上使用 nightwatch 运行自动化脚本时如何关闭 safari 弹出对话框?
- python - scikit中混淆矩阵的正确命名