Я работаю над 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
. Как будто кодировка отличается от формата, ожидаемого при декодировании.
Если я изменю проектДокумент, поэтому он наследует от 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
будет восстановлено.Это не