我有一个 Cocoa 应用程序,它向用户显示文件夹结构并允许基本的文件系统操作,例如移动/复制/重命名。
我在后台队列上执行所有文件系统访问,并通过NSFileCoordinator
.
假设用户将文件“Notes.txt”拖到文件夹“Project B”中。这是我所做的:
- 我安排在后台队列上移动文件的文件操作。
- 完成后,它会调用主队列上的一个块,我在其中更新大纲视图
假设移动文件的后台操作需要一些时间。我需要防止用户继续移动文件或执行其他操作,直到第一个操作完成。
因此,我想:
- 禁用所有用户与窗口的交互
- 禁用大多数菜单项和键盘快捷键
- 保持某些菜单,例如 [Quit Cmd-Q] 工作
- 不要阻塞主线程
想到的一种解决方案:使用模态表?.
我不想这样做,因为大多数情况下,操作会很快完成,并且工作表只会显示几分之一秒,这会分散注意力。
如果需要超过 500 毫秒,我会跟踪操作从“交互阻止模式”切换到“模式表”需要多长时间。
问题是:如何在不实际呈现模态表的情况下实现这样的“用户交互阻止模式”?
另一种想法:禁用所有控件
我考虑isEnabled = false
过对所有控件进行设置,但这不是一个选项,因为 UI 可以任意复杂,并且不会阻止通过菜单或键盘快捷键进行操作。