问题描述
我一直在努力让 mac 催化剂应用程序的 mac 版本正常工作。这是一个基于场景的、基于 DocumentbrowserViewController 的应用程序,在 iPad 上运行良好。在 Mac 上,它运行良好,除非您在屏幕上打开一个或多个文档窗口时关闭应用程序。当应用程序重新启动时,这些窗口会重新打开(除非用户在 Mac 系统偏好设置常规选项卡上选择在退出应用程序时关闭窗口),并且由于使用了安全范围书签,这些窗口会填充上一个文档。然而,这些由 macOS(版本 11.3.1)自动重新打开的窗口/场景不会像在基于场景的应用程序中那样运行,而是像基于 AppDelegate 的、非基于场景的应用程序那样运行。我的意思是,当使用系统提供的 New 菜单项时,DocumentbrowserViewController 看起来应该是这样,但是从浏览器中选择的文档会加载到系统提供的一个窗口中,替换那里的文档,而不是在一个新的窗口中打开窗口/场景。如果关闭这些窗口,然后选择“新建”菜单项,则第一次选择文件时它不会打开,并且在日志中会显示一条消息:“场景销毁请求失败,错误:(空)”,然后留言:
[Presentation] 尝试在 下次您选择“新建”时,文档浏览器会打开,您可以选择一个文件,它会在新窗口/场景中正常打开。 我使用 self.present(controller,animation: true) 从文档浏览器视图控制器呈现文档视图控制器,并尝试了各种技巧,包括通过将文档视图控制器设置为窗口的 rootViewController 来呈现文档视图控制器。我已经尝试了几乎所有的方法,但我相信根本问题是系统在应用程序重启时打开的窗口的行为不像基于场景的窗口应该的那样。我面临着留下这种奇怪的行为,惹恼用户,可能会招致 App Store 拒绝,或者在应用程序退出一般偏好时建议用户打开关闭窗口,惹恼用户,或复制代码库并使 mac 催化剂版本成为单一窗口,基于 AppDelegate 的,非基于场景的,烦我,扔掉多窗口功能。
解决方法
我也在开发基于 DocumentBrowserViewController 的应用程序,该应用程序具有多场景支持,并且在 Catalyst 上遇到了很多问题。每次打开文档时,我都会看到“场景销毁请求因错误而失败:(空)”错误,但它似乎并没有影响应用程序的功能,所以我一直忽略它。
我还遇到了“视图不在窗口层次结构中”的问题,我想出了一个解决方法,让我能够可靠地呈现文档。在我从文档浏览器视图控制器呈现文档的任何地方,我都使用以下代码片段:
if(self.view.window != nil) {
//This document browser's view is in the view hierarchy,so present as usual
self.present(viewController,animated: animated,completion: completion)
}
else {
//This document browser's view is not in the view hierarchy,find the view that is
let topWindow = UIApplication.shared.connectedScenes.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
let rootController = topWindow?.rootViewController
rootController?.present(viewController,completion: completion)
}