Подтвердить что ты не робот

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.

Но независимо от того, окно появляется одинаковым размером каждый раз. Это всегда "просто сработало" в прошлом, поэтому я не могу сказать, является ли это ошибкой, или частью, которую мне не хватает. Автоматически работает автосохранение с помощью раскадровки при создании экземпляров и показе окон вручную?

4b9b3361

Ответ 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"
    }
}