【问题标题】:NSWindowController Autosave using StoryboardNSWindowController 使用 Storyboard 自动保存
【发布时间】:2014-09-28 18:55:45
【问题描述】:

我有一个 Swift 应用程序正在启动一个简单的NSWindow,如下所示:

func applicationDidFinishLaunching(notification: NSNotification!) {
    let storyboard = NSStoryboard(name: "MainStoryboard", bundle: NSBundle.mainBundle())
    windowController = storyboard.instantiateInitialController() as? NSWindowController
    windowController?.showWindow(self)
}

这很好用,我的应用程序启动并出现窗口。 然而:大小总是一样的。

在故事板中,我指定了一个Autosave 名称:

还要注意 Restorable 复选框已选中。

但无论如何,窗口每次都显示相同的大小。这在过去总是“正常工作”,所以我不知道这是一个错误,还是我缺少的一块。手动实例化和显示窗口时,自动保存是否自动与情节提要一起使用?

【问题讨论】:

    标签: xcode macos cocoa storyboard osx-yosemite


    【解决方案1】:

    为了满足在接受的答案和 cmets 中确定的两个条件,对窗口控制器进行子类化似乎是可行的。然后,您可以避免在每个窗口控制器的代码中唯一地设置此属性,而只需指定情节提要的窗口自动保存属性(并设置窗口控制器的子类)。

    WindowController 的windowFrameAutosaveName 必须是

    1. 非空白
    2. 不同于Window的frameAutosaveName
    class AutoFrameSavingWindowController: NSWindowController
    {
        override func awakeFromNib() {
            if let autosaveName = window?.frameAutosaveName {
                windowFrameAutosaveName = autosaveName + " temp"
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      不知道有没有更好的办法,但是这里的问题是当AutosaveName在Interface Builder中设置,而Window是通过Segue打开的 strong>,窗口在预定义的位置打开并保存帧,覆盖上次保存的帧...

      如果您有一个预定义的屏幕中心位置,每次打开窗口时,它都会出现在中心位置并保存。

      为避免这种情况,我在 Window Controller(不在 IB 中)中设置了 AutosaveName恢复保存的 Frame 之后: p>

      class MyWindowController: NSWindowController {
          override func windowDidLoad() {
              super.windowDidLoad()
      
              let thewindow = window as! NSWindow
      
              /// restore position
              thewindow.setFrameUsingName("MyWindow")
              self.windowFrameAutosaveName = "MyWindow"
          }
      }
      

      【讨论】:

      • 它对我有用,但只有在我从 IB 中删除了“自动保存名称”值之后。
      • 是的,这是我回答“在窗口控制器中设置 AutosaveName(不在 IB 中)”的目的;)
      • “不在 IB 中”对我来说并不一定意味着“从 IB 中删除”
      【解决方案3】:

      这似乎是一个 Xcode 错误。我可以通过手动设置 NSWindowController windowFrameAutosaveName 属性来解决它:

      windowController?.windowFrameAutosaveName = "Main App Window"

      但是...这仅适用于我将属性设置为与 Interface Builder 中显示的值不同的 值。如果它以编程方式设置为与 IB 中使用的值相同的值,则它不起作用。

      所以在 IB 中,自动保存名称保留为 MainAppWindow,并以编程方式设置为 Main App Window

      【讨论】:

      • 这似乎不仅仅是 swift 相关的。我在 ObjC 中遇到了同样的问题,通过添加 self.windowFrameAutosaveName = @"MainWindow"; 解决了从笔尖唤醒。我还在 IB 故事板中将名称设置为“错误”。成功了。谢谢克雷格
      • 其实你可以简单地让故事板中的自动保存名称为空,然后在代码中设置它,它会起作用;)
      • @Frizlab 一个空的自动保存名称不是表明您希望帧信息保持不变吗?来自NSWindowController 文档:By default, name is an empty string, which means that no information is stored in the defaults database.
      • @CraigOtis 当然。但是在情节提要中,您更改了NSWindow 的自动保存名称,而不是NSWindowController 之一。来自NSWindowController 的那个接管(它实际上覆盖了NSWindow 的自动保存名称……)。
      • @Frizlab 啊,你是对的 - 我没有有意识地意识到差异。不幸的是,我不再拥有这个特定的 Xcode 项目,但我很想看看在 NSWindowController 上更改此属性的行为如何!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多