ios 如何避免奇怪的行为时,基于场景的文档mac催化剂应用程序重新启动应用程序重新打开窗口?

ygya80vv  于 2023-05-19  发布在  iOS
关注(0)|答案(1)|浏览(118)

我一直在努力让Mac版的一款Mac Catalyst应用程序正常工作。这是一个基于场景的,基于DocumentBrowserViewController的应用程序,在iPad上运行良好。在Mac上,它工作正常,除非当一个或多个文档窗口在屏幕上打开时关闭应用程序。当应用程序重新启动时,这些窗口会重新打开(除非用户在Mac系统偏好设置常规选项卡上选择在退出应用程序时关闭窗口),并且由于使用了安全范围的书签,这些窗口将填充最后一个文档。然而,这些由macOS(版本11.3.1)自动重新打开的窗口/场景并不像它们在基于场景的应用中一样,它们像基于AppDelegate的非基于场景的应用一样。我的意思是,当使用系统提供的New菜单项时,DocumentBrowserViewController会像它应该的那样出现,但是从浏览器中选择的文档会加载到系统提供的一个窗口中,替换那里的文档,而不是在一个新窗口/场景中打开。如果关闭这些窗口,然后选择“新建”菜单项,则第一次选择文件时,该文件未打开,并且日志中会显示一条消息:“场景销毁请求失败,出现错误:(null)”,然后是一条消息:
[Presentation]尝试在<UINavigationController: 0x7f9fd9808e00><EP_Diagram.DocumentBrowserViewController: 0x7f9fd880a400><EP_Diagram.DocumentBrowserViewController: 0x7f9fd880a400>其视图不在窗口层次结构中的上(从)呈现。
下次选择“新建”时,文档浏览器将打开,您可以选择一个文件,该文件将在新窗口/场景中正常打开。
我使用self.present(controller,animated:true),并尝试了各种技巧,包括通过将其设置为窗口的rootViewController来呈现文档视图控制器。我已经尝试了几乎所有的方法,但我确信最根本的问题是,在应用程序重启时系统打开的窗口不像基于场景的窗口那样工作。我面临着留下这种奇怪的行为,烦人的用户,也许会被App Store拒绝,或者建议用户在应用程序退出一般偏好时打开关闭的窗口,烦人的用户,或者复制代码库,使Mac Catalyst版本成为单窗口,AppDelegate基于,非场景基于,惹恼了我,扔掉了多窗口功能。
有没有其他人遇到过这个问题,有没有解决办法?这听起来像是mac catalyst或macOS bug吗?

vuktfyat

vuktfyat1#

我还在开发一个基于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)
    }

相关问题