我有来自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冻结问题。但是,对话框附加到主应用程序窗口,并且不会作为模式显示在前面。
如何实现以编程方式禁止的模式对话框?
答案 0 :(得分:2)
您只需关闭其窗口即可停止模型事件循环(或警报表)。实际上,使用现代NSAlert
API,您永远不必关闭或订购窗口 - 框架会为您处理此问题。
对于以runModal()
开头的提醒,请使用NSApplication
abortModal()
,stopModal()
或stopModal(withCode:)
。在runModal()
返回后,将警告窗口orderOut(nil)
发送给它以将其删除。
对于之后执行完成功能阻止的提醒表,请使用NSWindow
&#39 {s} endSheet(_)
或endSheet(_:returnCode:)
。完成块执行后,警报将自动删除。