0

我有一个 Cocoa 应用程序,它向用户显示文件夹结构并允许基本的文件系统操作,例如移动/复制/重命名。

应用截图

我在后台队列上执行所有文件系统访问,并通过NSFileCoordinator.

假设用户将文件“Notes.txt”拖到文件夹“Project B”中。这是我所做的:

  1. 我安排在后台队列上移动文件的文件操作。
  2. 完成后,它会调用主队列上的一个块,我在其中更新大纲视图

假设移动文件的后台操作需要一些时间。我需要防止用户继续移动文件或执行其他操作,直到第一个操作完成。

因此,我想:

  • 禁用所有用户与窗口的交互
  • 禁用大多数菜单项和键盘快捷键
  • 保持某些菜单,例如 [Quit Cmd-Q] 工作
  • 不要阻塞主线程

想到的一种解决方案:使用模态表?.

我不想这样做,因为大多数情况下,操作会很快完成,并且工作表只会显示几分之一秒,这会分散注意力。

如果需要超过 500 毫秒,我会跟踪操作从“交互阻止模式”切换到“模式表”需要多长时间。

问题是:如何在不实际呈现模态表的情况下实现这样的“用户交互阻止模式”?

另一种想法:禁用所有控件

我考虑isEnabled = false过对所有控件进行设置,但这不是一个选项,因为 UI 可以任意复杂,并且不会阻止通过菜单或键盘快捷键进行操作。

4

1 回答 1

-1

您可能会在 Apple 文档中找到有用的 The Responder Chain文章。正确的解决方案取决于您到底需要什么。覆盖NSMenu's- (BOOL)validateMenuItem:(NSMenuItem *)menuItem;让您可以控制启用菜单项及其快捷方式。您还可以NSView在要防止用户交互的区域上设置透明。

于 2019-12-14T12:34:57.317 回答