阻止NSWindow暂时接收输入事件

时间:2018-11-11 12:09:18

标签: macos

我想防止NSWindow临时接收(或处理)输入事件。好像显示了一张表或运行循环正在忙于执行代码。我该怎么办?

为什么?

当前,当用户在我的应用程序中执行“命令”时,将在主线程上对其进行处理。当然,这会导致窗口在命令持续时间内无响应。在大多数情况下,这是可以的,因为命令通常需要1-2秒才能执行。

有时该命令可能会花费很长时间(60秒或更长时间)。为了给用户一个取消命令的选项,我想在后台执行该命令,如果该命令在大约2秒钟后仍未完成,我想放一张纸,上面有一些信息和一个取消按钮。

我不想立即放好工作表,因为在大多数情况下,这会导致非常烦人的动画出现/消失,但是我需要在前2秒钟将GUI屏蔽。

2 个答案:

答案 0 :(得分:0)

您可以通过在NSWindow子类中覆盖sendEvent(_ event: NSEvent)来实现此目的。使用一个标志让窗口知道它不应该临时处理事件:

override func sendEvent(_ event: NSEvent) {
    guard shouldSendEvents else { return }
    super.sendEvent(event)
}

答案 1 :(得分:0)

我不确定此UI设计是否良好,但是如果您必须…可以使用信号灯。用0计数对其进行初始化。完成时,后台线程将对其发出信号。产生后台任务后,主线程可以等待2秒钟以等待它。如果后台任务首先完成,则主线程将在那时恢复。如果超时到期,主线程将恢复并可以使用“取消”按钮显示工作表。

顺便说一句,如果后台任务花了 超过2秒,您仍然会显示一张工作表,然后立即将其关闭。