繁体   English   中英

在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冻结问题。 但是, 该对话框已附加到主应用程序窗口 ,而未作为模态显示在最前面。

如何获得以编程方式可忽略的模式对话框?

您不能通过简单地关闭其事件窗口来停止模型事件循环(或警报表)。 实际上,使用现代的NSAlert API,您永远不必关闭或订购该窗口-框架会为您处理。

对于以runModal()开头的警报,请使用NSApplicationabortModal()stopModal()stopModal(withCode:) runModal()返回之后,向警报窗口发送orderOut(nil)将其删除。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM