如何在OSX应用程序中恢复窗口位置?

时间:2015-11-14 10:05:13

标签: swift macos nswindow autosave

我创建了一个故事板,它将窗口视图控制器作为初始视图控制器。我给窗口一个自动保存名称preferencesWindow。在首选项中,我在关闭时检查了[x] Restorable和[x] Release。

当我进入菜单并单击“首选项”时,我按如下方式加载窗口控制器:

    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)

2 个答案:

答案 0 :(得分:8)

这是Xcode 6中的一个错误,我不知道它是否在Xcode 7中得到修复。

在InterfaceBuilder中设置自动保存无效。要使其工作,只需在windowController的windowDidLoad()中设置其名称:

class MyWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        self.windowFrameAutosaveName = "position"
    }    
}

答案 1 :(得分:2)

斯威夫特4:

final class MyWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

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

}