【问题标题】:Cocoa Window Not Showing on macOS SierramacOS Sierra 上未显示 Cocoa 窗口
【发布时间】:2018-06-13 12:33:10
【问题描述】:

我有以下代码在我的 macOS 应用程序中显示一个新窗口。这是在 NSOpenPanelcompletionHandler 内。

let mainStoryBoard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
let windowController = mainStoryBoard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "WindowController")) as! NSWindowController
let myController = windowController.window!.contentViewController as! ViewController
myController.imageView.image = mainImage
windowController.showWindow(self)

mainImage 在上面定义。

问题是这段代码在 macOS High Sierra 上运行良好,但在 macOS Sierra 上,窗口有时会显示片刻然后消失。

为什么这适用于 macOS High Sierra 而不是 macOS Sierra?

【问题讨论】:

  • 可能其中一个对象被意外释放。如果不知道它们的范围是什么以及您的应用程序是如何构建的,就很难说清楚。但是我确实注意到了 10.11 和 10.12 之间的一些未记录的更改,所以也许 10.12 和 10.13 之间也有一些未记录的更改...
  • @Moritz 我什至如何开始调试它?基本上在applicationDidFinishLoading 上我有一个NSOpenPanel,并且在上面的代码正在运行的完成处理程序上。
  • 也许让你的窗口符合 NSWindowDelegate 然后看看在 Sierra 的 windowWillClose 会发生什么。但是如果不实际查看您的架构和这些对象的范围,就很难判断。而且我对NSStoryboard了解不多,我习惯用NSWindow手动创建窗口,所以我这里的提示可能不适用,对不起。
  • @Moritz 是的,那个函数没有被调用。
  • 那我会说你的一个对象确实被释放了,否则 windowWillClose 会被调用。不过,我不知道如何帮助您进一步调试。希望你能找到解决办法。

标签: swift macos cocoa nswindow nswindowcontroller


【解决方案1】:

我可以通过修复windowController 的范围来解决这个问题。将变量声明移到完成处理程序上方并将其设置为 nil 以开始修复问题。

我还添加了NSWindowDelegate并使用函数windowWillClosewindowController设置回nil以确保它被正确释放。

【讨论】:

    【解决方案2】:

    取消选中 NSWindow 的 Deferred 选项。

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多