NSWindowController Автосохранение с помощью раскадровки
У меня есть приложение Swift, которое запускает простой NSWindow
, например:
func applicationDidFinishLaunching(notification: NSNotification!) {
let storyboard = NSStoryboard(name: "MainStoryboard", bundle: NSBundle.mainBundle())
windowController = storyboard.instantiateInitialController() as? NSWindowController
windowController?.showWindow(self)
}
Это отлично работает, мое приложение запускается и появляется окно. Однако: размер всегда один и тот же.
В раскадровке я указал имя Autosave
:
![MainStoryboard]()
Примечание. Также отмечен флажок Restorable
.
Но независимо от того, окно появляется одинаковым размером каждый раз. Это всегда "просто сработало" в прошлом, поэтому я не могу сказать, является ли это ошибкой, или частью, которую мне не хватает. Автоматически работает автосохранение с помощью раскадровки при создании экземпляров и показе окон вручную?
Ответы
Ответ 1
Кажется, это ошибка Xcode. Я смог обходить его вручную, установив свойство NSWindowController
windowFrameAutosaveName
:
windowController?.windowFrameAutosaveName = "Main App Window"
Однако... Это работало только для меня, если свойство было установлено на другое значение, чем то, что отображается в Interface Builder. Если он программно настроен на то же значение, которое используется в IB, оно не работает.
Итак, в IB имя автосохранения остается MainAppWindow
, а программно оно установлено на Main App Window
.
Ответ 2
Я не знаю, есть ли лучший способ, но проблема здесь в том, что когда AutosaveName установлено в Interface Builder, а окно открыто через Segue, окно открывается в предопределенном месте и кадр сохраняется, перезаписывая последний сохраненный фрейм...
Если у вас есть предопределенная позиция в центре экрана, каждый раз, когда окно будет открыто, оно будет отображаться в центре и положение будет сохранено.
Чтобы этого избежать, я устанавливаю AutosaveName в Window Controller (не в IB), после восстанавливает сохраненный кадр: p >
class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
let thewindow = window as! NSWindow
/// restore position
thewindow.setFrameUsingName("MyWindow")
self.windowFrameAutosaveName = "MyWindow"
}
}