首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode 9故事板窗口位置自动保存

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

Stack Overflow用户
提问于 2017-11-07 19:27:59
回答 2查看 1.4K关注 0票数 4

我开始在Xcode 9 (macOS游戏与SceneKit技术)的新项目。我得到了包含NSWindowControllerNSWindow的故事板,以及与SCNView相关的GameViewController。项目运行良好(旋转飞机)。

现在,在故事板中,我将NSWindow的自动保存值设置为“NSWindow”,运行项目,调整窗口大小,然后退出。我知道,在自动保存设置为退出窗口时,将使用NSUserDefaults保存窗口位置,因此我签入终端:

代码语言:javascript
复制
$ 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会影响窗口的位置和大小。

也许有人知道怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-14 12:47:58

奇怪的是,这个答案是:https://stackoverflow.com/a/33707356/3736845仍然适用,即使是在XCode9中。在对autosave名称进行编程设置之后(对于Swift4来说有一点不同的符号):

代码语言:javascript
复制
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")
  }
}

它在重新启动应用程序时开始恢复位置。

然而,我不明白的是什么被保存到缺省值中:

代码语言:javascript
复制
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窗口自动保存标识符进行了一些处理--您可以看到它在默认情况下显示为第一行(“位置”),并且在应用程序启动时它似乎没有被正确读取。在我添加了手动设置的自动保存名称到“位置”--当我移动窗口时,它正在改变。

票数 6
EN

Stack Overflow用户

发布于 2018-10-21 11:03:52

这似乎是一个仍然存在于Xcode 10中的bug。下面是我(在Xcode 10中,在一个使用故事板的macOS Cocoa项目中)起作用的地方:

·在情节提要窗口的自动保存字段中没有设置任何值。

使用自定义窗口控制器类如下所示。

代码语言:javascript
复制
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.
        //---------------------------------------------------------------------
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47165996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档