【发布时间】:2018-06-13 12:33:10
【问题描述】:
我有以下代码在我的 macOS 应用程序中显示一个新窗口。这是在 NSOpenPanel 的 completionHandler 内。
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