0

我一直在努力让 mac 催化剂应用程序的 mac 版本正常工作。这是一个基于场景、基于 DocumentBrowserViewController 的应用程序,在 iPad 上运行良好。在 Mac 上,它工作正常,除非您在屏幕上打开一个或多个文档窗口时关闭应用程序。当应用程序重新启动时,这些窗口会重新打开(除非用户在 Mac 系统偏好设置常规选项卡上选择了在退出应用程序时关闭窗口),并且由于使用了安全范围的书签,这些窗口会填充最后一个文档。但是,这些由 macOS(版本 11.3.1)自动重新打开的窗口/场景不像在基于场景的应用程序中那样运行,它们就像基于 AppDelegate 的非基于场景的应用程序一样。我的意思是,当使用系统提供的 New 菜单项时,DocumentBrowserViewController 看起来应该是这样,但是从浏览器中选择的文档会加载到系统提供的一个窗口中,替换那里的文档,而不是在新窗口/场景中打开。如果关闭这些窗口,然后选择 New 菜单项,第一次选择文件时它没有打开,并且在日志中有一条消息:“Scene destroy request failed with error: (null)”然后一个消息:

[演示] 尝试在 <EP_Diagram.DocumentBrowserViewController: 0x7f9fd880a400> 上呈现 <UINavigationController: 0x7f9fd9808e00>(来自 <EP_Diagram.DocumentBrowserViewController: 0x7f9fd880a400>),其视图不在窗口层次结构中。

下次您选择新建时,文档浏览器将打开,您可以选择一个文件并在新窗口/场景中正常打开。

我使用 self.present(controller, animated: true) 从文档浏览器视图控制器呈现文档视图控制器,并尝试了各种技巧,包括通过将文档视图控制器设置为窗口的 rootViewController 来呈现文档视图控制器。我几乎尝试了所有方法,但我确信根本问题是应用程序重新启动时系统打开的窗口不像基于场景的窗口那样表现。我面临着留下这种奇怪的行为,烦人的用户,可能会招致 App Store 拒绝,或者建议用户在应用程序退出一般偏好时打开关闭的窗口,烦人的用户,或者复制代码库并使 mac 催化剂版本成为单一窗口,基于 AppDelegate 的,非基于场景的,烦我,丢掉多窗口能力。

有没有其他人遇到过这个问题,有什么解决方案吗?听起来像是 Mac 催化剂还是 macOS 错误?

4

1 回答 1

1

我还在开发一个基于 DocumentBrowserViewController 的应用程序,它支持多场景,并且遇到了很多关于 Catalyst 的问题。每次打开文档时,我都会看到“场景破坏请求失败并出现错误:(null)”错误,但它似乎不会影响应用程序的功能,所以我一直忽略它。

我还遇到了“视图不在窗口层次结构中”的问题,我想出了一个解决方法,可以让我可靠地呈现文档。在我从文档浏览器视图控制器中呈现文档的任何地方,我都会使用以下代码片段:

  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, animated: animated, completion: completion)
    }
于 2021-06-03T04:13:55.373 回答