Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Xcode 9情节提要窗口位置自动保存_Macos_Cocoa_Storyboard_Xcode9 - Fatal编程技术网

Macos Xcode 9情节提要窗口位置自动保存

Macos Xcode 9情节提要窗口位置自动保存,macos,cocoa,storyboard,xcode9,Macos,Cocoa,Storyboard,Xcode9,我在Xcode 9中启动了一个新项目(使用SceneKit技术的macOS游戏)。我得到的故事板包含NSWindowController和NSWindow以及相关的GameViewController和SCNView。项目运行良好(旋转平面) 现在在故事板中,我将NSWindow的Autosave值设置为“MainWindow”,运行project,调整窗口大小,然后退出。我知道,当自动保存设置为“退出”时,将使用NSUserDefaults保存窗口位置,因此我签入终端: $ defaults

我在Xcode 9中启动了一个新项目(使用SceneKit技术的macOS游戏)。我得到的故事板包含
NSWindowController
NSWindow
以及相关的
GameViewController
SCNView
。项目运行良好(旋转平面)

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

$ defaults read com.koati.Bloks                                           ⏎
{
    "NSWindow Frame MainWindow" = "415 228 450 322 0 0 1280 777 ";
}
这是意料之中的行为。现在我再次运行project,但我看到窗口位置并没有恢复。如果在故事板中我删除了
GameViewController
关系,那么位置会被正确保存和恢复,所以我认为
GameViewController
会以某种方式影响窗口大小和位置。 在使用XIB的旧Xcode中,没有这样的问题

EDIT:在做了一些测试之后,我现在认为它与SceneKit没有任何关系,因为在
NSViewController
中将
SCNView
替换为
NSView
会产生相同的结果。因此,我认为问题在于,通过故事板连接到
NSWindow
内容的
NSViewController
会影响窗口的位置和大小


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

奇怪的是,这个答案: 仍然适用,即使在XCode9中也是如此。自动保存名称的编程设置后(对于Swift4,表示法稍有不同):

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

但我不明白的是,默认值中保存了什么:

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 Window Autosave标识符进行了一些操作—您可以看到它显示为默认值(“位置”)中的第一行,并且在应用程序启动时似乎没有正确读取它。
在我将自动保存名称的手动设置添加到“位置”之后,当我移动窗口时,它正在改变。

这似乎是一个仍然存在于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.
        //---------------------------------------------------------------------
    }
}

我也经历过同样的问题,并且同意你的观察。我有一个关于这个问题的测试项目。模板中的默认值:窗口->视图控制器->视图保留位置和大小。如果我替换为窗口->分割视图控制器->视图,它不会保留位置和大小(始终返回默认位置和大小)。如果我在Window->View Controller->View->Container View->Split View Controller->View中执行此操作,它同样会保留大小和位置。不好的是,我需要使用额外的NSWindowController来实现默认的IB功能。看起来像个bug。请记住框架的每个名称都必须是唯一的。也就是说,如果您有多个窗口,请为每个窗口创建一个具有自己名称的类。可能不是最漂亮的解决方案,但如果你的Mac应用程序中只有几个其他窗口,它就可以很好地工作。
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.
        //---------------------------------------------------------------------
    }
}