Как восстановить положение окна в приложении OSX?

Я создал раскадровку, в которой в качестве начального контроллера представления используется контроллер окна. Я дал окну имя автосохранения preferencesWindow. В настройках я отметил [x] Восстанавливаемый и [x] Освобождать при закрытии.

Когда я захожу в меню и нажимаю «Настройки», я загружаю оконный контроллер следующим образом:

    let storyboard          = NSStoryboard(name: "Preferences", bundle: nil)
    let windowController    = storyboard.instantiateInitialController() as? NSWindowController
    let window              = windowController?.window

    windowController!.showWindow(self)

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

Ответ. Похоже, это ошибка в xCode 7, когда установка имени автоматического сохранения в коде решила ее.

    let storyboard          = NSStoryboard(name: "Preferences", bundle: nil)
    let windowController    = storyboard.instantiateInitialController() as? NSWindowController
    let window              = windowController?.window

    window!.setFrameAutosaveName("preferences")
    windowController!.showWindow(self)

person Mark    schedule 14.11.2015    source источник
comment
Один из способов — сохранить координаты окна, когда windowWillClose: (см. Справочник по протоколу NSWindowDelegate), затем переместите окно, когда оно появится снова.   -  person Arc676    schedule 14.11.2015


Ответы (2)


Это ошибка в Xcode 6, и я не знаю, исправлена ​​ли она в Xcode 7.

Установка автосохранения в InterfaceBuilder не имеет никакого эффекта. Чтобы заставить его работать, просто установите его имя в windowDidLoad() вашего оконного контроллера:

class MyWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        self.windowFrameAutosaveName = "position"
    }    
}
person zisoft    schedule 14.11.2015
comment
Да, установка имени автосохранения в коде решила проблему. - person Mark; 14.11.2015

Свифт 4:

final class MyWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        self.windowFrameAutosaveName = NSWindow.FrameAutosaveName(rawValue: "myWindow")
    }

}
person dbrownjave    schedule 10.03.2018