NSWindowController使用Storyboard自动保存

Cra*_*tis 13 macos xcode cocoa storyboard osx-yosemite

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

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

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

在故事板中,我指定了一个Autosave名称:

MainStoryboard

另请注意,Restorable复选框已选中.

但无论如何,每次窗口看起来都是相同的.这在过去总是"刚刚起作用",所以我不知道这是一个错误,还是我错过的一个部分.在手动实例化和显示窗口时,自动保存是否自动与故事板一起使用?

Cra*_*tis 29

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

windowController?.windowFrameAutosaveName = "Main App Window"

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

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

  • 这似乎并不是迅速相关的.我在ObjC中遇到了同样的问题,通过添加self.windowFrameAutosaveName = @"MainWindow"来解决; to awakeFromNib.我也在IB故事板中将名称设置为"错误".诀窍.谢谢克雷格 (3认同)
  • 实际上你可以简单地让故事板中的自动保存名称为空,只需在代码中设置它,它就可以工作;) (3认同)
  • @CraigOtis当然。但是在情节提要中,您更改了“NSWindow”的自动保存名称,而不是“NSWindowController”的名称。来自 `NSWindowController` 的那个接管了(它实际上覆盖了 `NSWindow` 的自动保存名称......)。 (2认同)

Ati*_*ika 7

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

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

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

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

        let thewindow = window as! NSWindow

        /// restore position
        thewindow.setFrameUsingName("MyWindow")
        self.windowFrameAutosaveName = "MyWindow"
    }
}
Run Code Online (Sandbox Code Playgroud)


DDP*_*DDP 5

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

WindowControllerwindowFrameAutosaveName必须是

  1. 不为空
  2. 与Window不同frameAutosaveName
class AutoFrameSavingWindowController: NSWindowController
{
    override func awakeFromNib() {
        if let autosaveName = window?.frameAutosaveName {
            windowFrameAutosaveName = autosaveName + " temp"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)