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

时间:2018-02-08 15:05:03

标签: swift macos nsalert

我有来自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冻结问题。但是,对话框附加到主应用程序窗口,并且不会作为模式显示在前面。

  3. 如何实现以编程方式禁止的模式对话框?

1 个答案:

答案 0 :(得分:2)

您只需关闭其窗口即可停止模型事件循环(或警报表)。实际上,使用现代NSAlert API,您永远不必关闭或订购窗口 - 框架会为您处理此问题。

对于以runModal()开头的提醒,请使用NSApplication abortModal()stopModal()stopModal(withCode:)。在runModal()返回后,将警告窗口orderOut(nil)发送给它以将其删除。

对于之后执行完成功能阻止的提醒表,请使用NSWindow&#39 {s} endSheet(_)endSheet(_:returnCode:)。完成块执行后,警报将自动删除。