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

Swift 如何在OSX应用程序中恢复窗口位置?,swift,macos,nswindow,autosave,Swift,Macos,Nswindow,Autosave,我创建了一个故事板,它将窗口视图控制器作为初始视图控制器。我给了窗口一个自动保存名称首选项swindow。在首选项中,我选中了[x]可恢复和[x]关闭时释放 当我进入菜单并单击“首选项”时,我加载窗口控制器,如下所示: let storyboard = NSStoryboard(name: "Preferences", bundle: nil) let windowController = storyboard.instantiateInitialCont

我创建了一个故事板,它将窗口视图控制器作为初始视图控制器。我给了窗口一个自动保存名称
首选项swindow
。在首选项中,我选中了[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)

这是Xcode 6中的一个bug,我不知道它是否在Xcode 7中修复

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

class MyWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        self.windowFrameAutosaveName = "position"
    }    
}
Swift 4:

final class MyWindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

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

}

一种方法是在调用
窗口将关闭时存储窗口坐标:
(请参阅),然后在再次出现时移动窗口。是的,在代码中设置自动保存名称解决了问题。