Xcode 9故事板窗口位置自动保存

时间:2017-11-07 19:28:00

标签: macos cocoa storyboard xcode9

我在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内容影响窗口位置和大小。

也许有人知道如何解决这个问题?

2 个答案:

答案 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.
        //---------------------------------------------------------------------
    }
}