我有一个基于NSDocument
的应用,我希望在重新打开文档时保存并恢复我的窗口位置。 Apple关于此的文档非常稀少,但我能够拼凑起来的是,在某些时候,应用中的某些内容需要调用NSWindow.setFrameUsingName()
和NSWindow.setFrameAutosaveName()
。< / p>
我还没想到的是,这需要发生什么,以及需要做些什么。例如,这根本不起作用:
// In my NSDocument class
override func windowControllerDidLoadNib(aController: NSWindowController) {
super.windowControllerDidLoadNib(aController)
// Add any code here that needs to be executed once the windowController has loaded the document's window.
aController.window?.setFrameUsingName("MainWindow")
aController.window?.setFrameAutosaveName("MainWindow")
}
我已经阅读了各种不同的文档或论坛答案,指出awakeFromNib()
是另一个要做的事情,但我无法做到这一点。
我也很困惑/担心这会在某种程度上受到自动布局的影响或者我在Interface Builder中做错了什么 - 例如,这就是我在IB中设置窗口的方式:
我并不特别希望我的窗口居中,但其他选项似乎将它锁定在固定的水平或固定垂直位置,这也是我真正不想要的。让我的窗口居中的一个副作用是我的文档窗口不再级联,我既不想也不能停止发生(注意windowController.shouldCascadeWindows = true
也没有帮助)。
那么 - 这里发生了什么?我发现这个主题的知识特别不清楚或误导,可能已经过时了2015年的可可开发,所以对此进行现代复习会很棒。
答案 0 :(得分:3)
步骤1:在IB中,为窗口指定自动保存名称。
第2步:没有第2步。
答案 1 :(得分:0)
为窗口框架设置自动保存名称的最简单的位置可能是在您的NSDocument实现中。
如果在实现中覆盖makeWindowControllers()
,则表示您正在手动创建窗口控制器,因此可以在此处设置名称:
override func makeWindowControllers() {
let storyboard = NSStoryboard(name: NSStoryboard.Name("MyDocumentStoryboard"), bundle: nil)
let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("MyDocument Window Controller")) as! MyDocumentWindowController
// this assumes you have a stored property or a computed property `someUniqueIdentifier` that is as unique as possible for your document
// and that you store on disk together with the rest of the document properties
windowController.windowFrameAutosaveName = NSWindow.FrameAutosaveName(rawValue: someUniqueIdentifier)
self.addWindowController(windowController)
}
如果通过覆盖windowNibName
实例化文档窗口,则应覆盖方法windowControllerDidLoadNib(_:)
,以在窗口上设置自动保存名称。我尚未测试此代码,但我认为它将起作用:
func windowControllerDidLoadNib(_ windowController: NSWindowController) {
// this assumes you have a stored property or a computed property `someUniqueIdentifier` that is as unique as possible for your document
// and that you store on disk together with the rest of the document properties
windowController.windowFrameAutosaveName = NSWindow.FrameAutosaveName(rawValue: someUniqueIdentifier)
}