swift - 在 MacOS 中以编程方式关闭模式对话框

标签 swift macos nsalert

我有一个来自 MacOS 应用程序 AppDelegate 的警告对话框,需要使用新信息进行更新。当新信息可用时,我想以编程方式关闭旧对话框并显示新对话框。我尝试过两种方法,但都有问题:

  1. 使用alert.runModal()

    如果我使用上述内容,则会根据需要呈现模式。然后,我可以稍后使用 lockWarningModal.window.close() 关闭该对话框,它可以使旧对话框消失,但它会卡住 UI,因此我无法再与其交互。 我猜测这是因为 alert.runModal() 是同步的,并且主线程仍然被阻塞。但是,我不知道如何发布它。

  2. 在 } 中使用 alert.beginSheetModal(for: NSApplication.shared.windows.last!) { (response)

    如果我使用上述内容并使用 NSApplication.shared.windows.last!.endSheet(alert.window) 关闭对话框,则可以解决 UI 卡住问题。但是,该对话框附加到主应用程序窗口,并且不会作为模式显示在前面。

如何实现可通过编程方式关闭的模式对话框?

最佳答案

您无法通过简单地关闭窗口来停止模型事件循环(或警报表)。事实上,使用现代的 NSAlert API,您永远不必关闭或退出窗口 - 框架会为您处理这个问题。

对于使用 runModal() 启动的警报,请使用 NSApplicationabortModal()stopModal() ,或 stopModal(withCode:)。在 runModal() 返回后,向警报窗口发送 orderOut(nil) 将其删除。

对于随后执行完成 block 的警报表,请使用 NSWindowendSheet(_)endSheet(_:returnCode:)。完成 block 执行后,警报将自动删除。

关于swift - 在 MacOS 中以编程方式关闭模式对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688574/

相关文章:

swift - 如何获取 NSStackView 作为 NSAlert 的附属 View ?

macos - 在 NSAlert 中单击按钮的 AppleScript 代码

objective-c - NSAlert 提示输入由以 root 身份运行的进程生成的文本

ios - Swift 3 indexPathForSelectedRow - 获取空路径

swift - 字符串格式限制有效数字Swift

ios - 检测 Sprite 纹理内的触摸而不是整个框架 iOS Swift SpriteKit?

swift - 在 macOS 上播放声音

swift - 在 Swift 中调用存储在数组中的函数会产生 "Unexpected trailing closure"

java - Mac 用户 - 如何在 Mac 中设置 CLASSPATHS(我正在处理 Lucene 演示)

macos - 使用 Productbuild 对 mac 应用程序进行签名和存档,无需使用 xcode 在 Mac App Store 之外分发应用程序