我有一个来自 MacOS 应用程序 AppDelegate 的警告对话框,需要使用新信息进行更新。当新信息可用时,我想以编程方式关闭旧对话框并显示新对话框。我尝试过两种方法,但都有问题:
使用
alert.runModal()
如果我使用上述内容,则会根据需要呈现模式。然后,我可以稍后使用 lockWarningModal.window.close() 关闭该对话框,它可以使旧对话框消失,但它会卡住 UI,因此我无法再与其交互。 我猜测这是因为
alert.runModal()
是同步的,并且主线程仍然被阻塞。但是,我不知道如何发布它。在 } 中使用
alert.beginSheetModal(for: NSApplication.shared.windows.last!) { (response)
如果我使用上述内容并使用
NSApplication.shared.windows.last!.endSheet(alert.window)
关闭对话框,则可以解决 UI 卡住问题。但是,该对话框附加到主应用程序窗口,并且不会作为模式显示在前面。
如何实现可通过编程方式关闭的模式对话框?
最佳答案
您无法通过简单地关闭窗口来停止模型事件循环(或警报表)。事实上,使用现代的 NSAlert API,您永远不必关闭或退出窗口 - 框架会为您处理这个问题。
对于使用 runModal()
启动的警报,请使用 NSApplication
的 abortModal()
、stopModal()
,或 stopModal(withCode:)
。在 runModal()
返回后,向警报窗口发送 orderOut(nil)
将其删除。
对于随后执行完成 block 的警报表,请使用 NSWindow
的 endSheet(_)
或 endSheet(_:returnCode:)
。完成 block 执行后,警报将自动删除。
关于swift - 在 MacOS 中以编程方式关闭模式对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688574/