模态对话框在基于 Mac 催化剂场景的应用程序中中断响应者链

Posted

技术标签:

【中文标题】模态对话框在基于 Mac 催化剂场景的应用程序中中断响应者链【英文标题】:Modal dialogs breaking responder chain in mac catalyst scene based app 【发布时间】:2021-07-15 23:11:31 【问题描述】:

我有一个基于多窗口场景(不是 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)

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于模态对话框在基于 Mac 催化剂场景的应用程序中中断响应者链的主要内容,如果未能解决你的问题,请参考以下文章

Mac Catalyst - 保存文件的标准对话框

一种在 Mac 上强制关闭模态 QFileDialog 的方法

Mac-catalyst - Mac 催化剂应用程序的最小窗口大小

为 mac 催化剂的 info.plist 文件中的键设置不同的值

为 mac 催化剂的 info.plist 文件中的键设置不同的值

Xcode 11 - 在催化剂 Swift 中禁用调整大小模式