Пользовательский NSWindowController на основе документов не сохраняет состояние окна

#macos #cocoa #appkit

#macos #cocoa #appkit

Вопрос:

У меня есть приложение macOS на основе документов, которое использует пользовательский NSWindowController . Этот оконный контроллер создает экземпляр самого себя с помощью кончика в основном для панели инструментов, но программно устанавливает его содержимое.

 final class ProjectWindowController: NSWindowController {

    lazy var splitViewController = HostingSplitViewController()

    override var document: AnyObject? {
        didSet {
            guard let project = document as? ProjectDocument else { return }
            splitViewController.document = project
        }
    }

    convenience init() {
        self.init(windowNibName: "ProjectWindowController")
    }

    override func windowDidLoad() {
        super.windowDidLoad()

        contentViewController = splitViewController
    }
}
  

Затем в моем документе я создаю экземпляр и добавляю этот оконный контроллер в makeWindowControllers()

     override func makeWindowControllers() {
        let windowController = ProjectWindowController()
        addWindowController(windowController)
    }
  

Проблема, которую я вижу, заключается в том, что состояние окна не сохраняется таким образом. frameAutosaveName Правильно установлено, но каждое новое окно представляет собой причудливую крошечную версию, и ничего не запоминается. Если я переверну процесс и вместо использования makeWindowControllers() use windowNibName , то мой пользовательский контроллер никогда не будет создан. Это несмотря на то, что он помечен как мой пользовательский класс. File Owner ProjectWindowController

 override var windowNibName: NSNib.Name? { "ProjectWindowController" }
  

Это сохранит состояние окна, но ни один из моих материалов не появится, потому что он утверждает, что его владелец является универсальным NSWindowController . У кого-нибудь есть идеи о том, как это решить?

Комментарии:

1. Вы хотите восстановить состояние или фрейм?

2. На данный момент фрейма будет достаточно. Разве это не должно быть автоматическим? Но если у вас также есть ресурсы для полного состояния, я бы с удовольствием использовал оба.