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

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

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

[Presentation] 尝试在 上呈现 (来自 窗口)

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

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?