15

我有一个启动简单的 Swift 应用程序NSWindow,如下所示:

func applicationDidFinishLaunching(notification: NSNotification!) {
    let storyboard = NSStoryboard(name: "MainStoryboard", bundle: NSBundle.mainBundle())
    windowController = storyboard.instantiateInitialController() as? NSWindowController
    windowController?.showWindow(self)
}

这很好用,我的应用程序启动并出现窗口。但是:大小始终相同。

在情节提要中,我指定了一个Autosave名称:

主线故事板

另请注意,该Restorable复选框已选中。

但无论如何,窗口每次都显示相同的大小。这在过去总是“正常工作”,所以我不知道这是一个错误,还是我缺少的一块。手动实例化和显示窗口时,自动保存是否会自动与情节提要一起使用?

4

3 回答 3

30

这似乎是一个 Xcode 错误。我可以通过手动设置NSWindowController windowFrameAutosaveName属性来解决它:

windowController?.windowFrameAutosaveName = "Main App Window"

但是...这仅在属性设置为与 Interface Builder 中显示的值不同的值时才对我有用。如果它以编程方式设置为与 IB 中使用的值相同的值,则它不起作用。

因此,在 IB 中,自动保存名称保留为MainAppWindow,并以编程方式将其设置为Main App Window.

于 2014-08-12T00:46:52.000 回答
7

我不知道是否有更好的方法,但这里的问题是,当在 Interface Builder 中设置 AutosaveName并且通过 Segue 打开窗口时,窗口在预定义的位置打开并保存框架,覆盖最后保存的帧...

如果您对屏幕中心有一个预定义的位置,则每次打开窗口时,它都会出现在中心位置并保存该位置。

为避免这种情况,在恢复保存的帧,我在窗口控制器(不在 IB 中)中设置了AutosaveName :

class MyWindowController: NSWindowController {
    override func windowDidLoad() {
        super.windowDidLoad()

        let thewindow = window as! NSWindow

        /// restore position
        thewindow.setFrameUsingName("MyWindow")
        self.windowFrameAutosaveName = "MyWindow"
    }
}
于 2017-05-23T16:15:24.757 回答
3

为了满足接受的答案和评论中确定的两个条件,对窗口控制器进行子类化似乎是可行的。然后,您可以避免在每个窗口控制器的代码中唯一地设置此属性,而只需指定情节提要的窗口自动保存属性(并设置窗口控制器的子类)。

WindowController 的windowFrameAutosaveName必须是

  1. 非空白
  2. 不同于Window的frameAutosaveName
class AutoFrameSavingWindowController: NSWindowController
{
    override func awakeFromNib() {
        if let autosaveName = window?.frameAutosaveName {
            windowFrameAutosaveName = autosaveName + " temp"
            }
        }
    }
}
于 2020-04-29T21:35:45.330 回答