#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. На данный момент фрейма будет достаточно. Разве это не должно быть автоматическим? Но если у вас также есть ресурсы для полного состояния, я бы с удовольствием использовал оба.