Восстановление вложенных NSDocuments - PullRequest
0 голосов
/ 02 февраля 2019

Я работаю над 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 будет восстановлено.Это не

...