模态对话框破坏了基于 mac 催化剂场景的应用程序中的响应链

问题描述

我有一个基于多窗口场景(不是 SwiftUI)的 iPad 应用程序,我正在使用 mac 催化剂为 Mac 进行调整。我的主菜单行为有问题。菜单是使用 func buildMenu() 在 AppDelegate.swift 中构建的。例如,我有一个 Open Image... 菜单项,它在我的主视图控制器中使用了一个选择器。这是 buildMenu() 中的代码

 let openFileCommand = UIKeyCommand(
            title: "Open Image...",action: #selector(DiagramViewController.openImageFile(_:)),input: "o",modifierFlags: [.command]
        )
        let openFileMenu = UIMenu(
            title: "",image: nil,identifier: UIMenu.Identifier("openImage"),options: .displayInline,children: [openFileCommand]
        )
        builder.insertSibling(openFileMenu,afterMenu: .newScene)

当第一次打开视图控制器时它被启用并且工作正常。看:

Open Image... menu item activated

然后我打开任何模式对话框,例如关于对话框,关闭它后,打开图像...菜单项被停用,好像选择器不再在响应者链中,尽管一切都在视图控制器。

Open Image... menu item is deactivated

我不明白这里发生了什么。这种功能在非多窗口催化剂应用上运行良好。

更新:这个问题与基于场景的应用程序无关。它是一个基于 UIDocument 的应用程序,uidocumentbrowserviewcontroller 以模态方式呈现主视图控制器。主视图控制器然后是第一响应者,一切都很好,但是一旦你在它上面打开另一个模态窗口,就像系统生成的关于对话框,原始文档浏览器视图控制器成为第一响应者和主视图控制器不再在窗口层次结构中(即使文档浏览器视图控制器不可见,并且主视图控制器仍然显示并正常工作)。如果有人有处理这个问题的经验,我会很感激他们的建议。

解决方法

通过进一步的实验,并且鉴于这是一个基于 UIDocument 的应用程序,看起来文档浏览器视图控制器在对话框关闭后成为第一响应者。所以我想我可以解决这个问题,并将操作从文档浏览器转发到主视图控制器。