Восстановление вложенных NSDocuments
Я работаю над Xcode-подобной IDE для MacOS. Среда 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
быть восстановленным. Это не