[英]Programmatically dismiss modal dialog in MacOS
我有一个来自MacOS应用程序的AppDelegate的警告对话框,需要使用新信息进行更新。 当有新信息可用时,我想以编程方式关闭旧对话框并显示新对话框。 我尝试了两种方式,但都存在问题:
使用alert.runModal()
如果我使用上面的方法,则会根据需要呈现一个模态。 然后,我可以稍后使用lockWarningModal.window.close()
关闭该对话框,它可以使旧对话框消失, 但是它冻结了UI,因此我无法再与之交互。 我猜这是因为alert.runModal()
是同步的,并且主线程仍然被阻塞。 但是,我不知道该如何发布。
使用alert.beginSheetModal(for: NSApplication.shared.windows.last!) { (response) in }
如果我使用上述方法并使用NSApplication.shared.windows.last!.endSheet(alert.window)
关闭对话框,则可以解决UI冻结问题。 但是, 该对话框已附加到主应用程序窗口 ,而未作为模态显示在最前面。
如何获得以编程方式可忽略的模式对话框?
您不能通过简单地关闭其事件窗口来停止模型事件循环(或警报表)。 实际上,使用现代的NSAlert
API,您永远不必关闭或订购该窗口-框架会为您处理。
对于以runModal()
开头的警报,请使用NSApplication
的abortModal()
, stopModal()
或stopModal(withCode:)
。 在runModal()
返回之后,向警报窗口发送orderOut(nil)
将其删除。
对于随后执行完成块的警报表,请使用NSWindow
的endSheet(_)
或endSheet(_:returnCode:)
。 您的完成区块执行后,警报将自动删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.