以编程方式关闭 MacOS 中的模态对话框
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 冻结问题。但是,该对话框附加到主应用程序 window,并没有作为模态出现在前面。
如何实现可通过编程关闭的模态对话框?
您无法通过简单地关闭其 window 来停止模型事件循环(或警报 sheet)。事实上,使用现代 NSAlert
API,您永远不必关闭或订购 window — 框架会为您处理。
对于以 runModal()
开头的警报,请使用 NSApplication
的 abortModal()
、stopModal()
或 stopModal(withCode:)
。在 runModal()
returns 之后,发送警报 window 和 orderOut(nil)
以将其删除。
对于随后执行完成块的警报 sheet,请使用 NSWindow
的 endSheet(_)
或 endSheet(_:returnCode:)
。完成块执行后,警报将自动删除。
我有一个来自 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 冻结问题。但是,该对话框附加到主应用程序 window,并没有作为模态出现在前面。
如何实现可通过编程关闭的模态对话框?
您无法通过简单地关闭其 window 来停止模型事件循环(或警报 sheet)。事实上,使用现代 NSAlert
API,您永远不必关闭或订购 window — 框架会为您处理。
对于以 runModal()
开头的警报,请使用 NSApplication
的 abortModal()
、stopModal()
或 stopModal(withCode:)
。在 runModal()
returns 之后,发送警报 window 和 orderOut(nil)
以将其删除。
对于随后执行完成块的警报 sheet,请使用 NSWindow
的 endSheet(_)
或 endSheet(_:returnCode:)
。完成块执行后,警报将自动删除。