我在Xcode 9中启动了新项目(使用SceneKit技术的macOS游戏)。我的故事板包含NSWindowController
NSWindow
和相关GameViewController
SCNView
的故事板。项目运行良好(旋转飞机)。
现在在故事板中,我为NSWindow
设置了自动保存值为“MainWindow”,运行项目,调整窗口大小然后退出。我知道使用自动保存设置退出窗口位置将使用NSUserDefaults
保存,所以我检查终端:
$ defaults read com.koati.Bloks ⏎
{
"NSWindow Frame MainWindow" = "415 228 450 322 0 0 1280 777 ";
}
这是预期的行为。现在我再次运行项目,但我看到窗口位置没有恢复。如果在故事板中我删除了GameViewController
关系,那么位置会被保存并正确恢复,所以我认为GameViewController
会以某种方式影响窗口大小和位置。
在使用XIB的旧Xcode中没有这样的问题。
编辑:在做了一些测试之后,我现在认为它与SceneKit完全无关,因为在SCNView
中用NSView
替换NSViewController
会产生相同的结果。所以我认为问题是通过Storyboard附加到NSViewController
内容影响窗口位置和大小。
也许有人知道如何解决这个问题?
答案 0 :(得分:1)
奇怪的是,这个答案:https://stackoverflow.com/a/33707356/3736845 仍然适用,即使在XCode9中也是如此。在自动保存名称的编程设置之后(对于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窗口自动保存标识符 - 您看到它在默认值中显示为第一行("位置")并且在应用程序启动时似乎没有正确读取。 在我添加手动设置的自动保存名称到"位置" - 当我移动窗户时,它正在改变。
答案 1 :(得分:0)
这似乎仍然是Xcode 10中的错误。这对我有用(在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.
//---------------------------------------------------------------------
}
}