Восстановление вложенных 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 быть восстановленным. Это не

0 ответов

Другие вопросы по тегам