以编程方式关闭 MacOS 中的模态对话框

Programmatically dismiss modal dialog in MacOS

我有一个来自 MacOS 应用程序的 AppDelegate 的警告对话框,需要使用新信息进行更新。当新信息可用时,我想以编程方式关闭旧对话框并显示新对话框。我已经尝试过这两种方式,但都存在问题:

  1. 使用alert.runModal()

    如果我使用上面的方法,就会根据需要显示一个模态。然后我可以稍后使用 lockWarningModal.window.close() 关闭对话框,它可以使旧对话框消失,但是它冻结了 UI,所以我不能再与之交互。 我猜这是因为 alert.runModal() 是同步的,主线程仍然被阻塞。但是,我不知道怎么发布。

  2. 使用alert.beginSheetModal(for: NSApplication.shared.windows.last!) { (response) in }

    如果我使用上面的方法并使用 NSApplication.shared.windows.last!.endSheet(alert.window) 关闭对话框,那么这就解决了 UI 冻结问题。但是,该对话框附加到主应用程序 window,并没有作为模态出现在前面。

如何实现可通过编程关闭的模态对话框?

您无法通过简单地关闭其 window 来停止模型事件循环(或警报 sheet)。事实上,使用现代 NSAlert API,您永远不必关闭或订购 window — 框架会为您处理。

对于以 runModal() 开头的警报,请使用 NSApplicationabortModal()stopModal()stopModal(withCode:)。在 runModal() returns 之后,发送警报 window 和 orderOut(nil) 以将其删除。

对于随后执行完成块的警报 sheet,请使用 NSWindowendSheet(_)endSheet(_:returnCode:)。完成块执行后,警报将自动删除。