我开始在Xcode 9 (macOS游戏与SceneKit技术)的新项目。我得到了包含NSWindowController和NSWindow的故事板,以及与SCNView相关的GameViewController。项目运行良好(旋转飞机)。
现在,在故事板中,我将NSWindow的自动保存值设置为“NSWindow”,运行项目,调整窗口大小,然后退出。我知道,在自动保存设置为退出窗口时,将使用NSUserDefaults保存窗口位置,因此我签入终端:
$ defaults read com.koati.Bloks ⏎
{
"NSWindow Frame MainWindow" = "415 228 450 322 0 0 1280 777 ";
}这是预期的行为。现在我再次运行项目,但我看到窗口位置没有恢复。如果在情节提要中删除GameViewController关系,那么位置将被正确保存和恢复,因此我假设GameViewController会以某种方式影响窗口大小和位置。在使用XIB的旧Xcode中,没有这样的问题。
编辑:在做了一些测试之后,我现在认为它与SceneKit完全无关,因为在NSViewController中用NSView代替SCNView会产生相同的结果。因此,我认为问题在于,通过童话板连接到NSViewController内容的NSWindow会影响窗口的位置和大小。
也许有人知道怎么解决这个问题?
发布于 2017-11-14 12:47:58
奇怪的是,这个答案是:https://stackoverflow.com/a/33707356/3736845仍然适用,即使是在XCode9中。在对autosave名称进行编程设置之后(对于Swift4来说有一点不同的符号):
class MainWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
self.windowFrameAutosaveName = NSWindow.FrameAutosaveName.init(rawValue: "position")
}
}它在重新启动应用程序时开始恢复位置。
然而,我不明白的是什么被保存到缺省值中:
defaults read com.ne.TestWindowPosition
{
"NSWindow Frame Position" = "510 428 901 322 0 0 1920 1177 ";
"NSWindow Frame position" = "0 0 901 322 0 0 1920 1177 ";
}我对IB窗口自动保存标识符进行了一些处理--您可以看到它在默认情况下显示为第一行(“位置”),并且在应用程序启动时它似乎没有被正确读取。在我添加了手动设置的自动保存名称到“位置”--当我移动窗口时,它正在改变。
发布于 2018-10-21 11:03:52
这似乎是一个仍然存在于Xcode 10中的bug。下面是我(在Xcode 10中,在一个使用故事板的macOS Cocoa项目中)起作用的地方:
·在情节提要窗口的自动保存字段中没有设置任何值。
使用自定义窗口控制器类如下所示。
import AppKit
class WindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
//---------------------------------------------------------------------
// Workaround for a bug in autosave default for window frame:
window!.setFrameAutosaveName("position")
// It has to be "position" here in code, and no value in storyboard.
//---------------------------------------------------------------------
}
}https://stackoverflow.com/questions/47165996
复制相似问题