ユーザーにフォルダー構造を提示し、移動/コピー/名前変更などの基本的なファイル システム操作を可能にする Cocoa アプリを使用しています。
私はすべてのファイル システム アクセスをバックグラウンド キューで実行し、 経由でファイル調整を使用しますNSFileCoordinator
。
ユーザーがファイル「Notes.txt」をフォルダ「Project B」にドラッグしたとします。これが私がすることです:
- バックグラウンド キューでファイルを移動するファイル操作をスケジュールします。
- それが完了すると、アウトライン ビューを更新するメイン キューのブロックが呼び出されます。
ファイルを移動するバックグラウンド操作に時間がかかるとします。最初の操作が完了するまで、ユーザーがファイルを移動したり、他のアクションを実行したりしないようにする必要があります。
したがって、私はしたいと思います:
- ウィンドウとのすべてのユーザー操作を無効にする
- ほとんどのメニュー項目とキーボード ショートカットを無効にする
- [Quit Cmd-Q] などの特定のメニューを機能させ続ける
- メインスレッドをブロックしない
頭に浮かぶ 1 つの解決策:モーダル シートを使用しますか? .
ほとんどの場合、操作はすぐに終了し、シートはほんの一瞬しか表示されず、気が散ってしまうため、私はこれを行いたくありません。
500ミリ秒以上かかる場合、操作が「対話ブロックモード」から「モーダルシート」に切り替わるのにかかる時間を追跡します。
問題は、実際にモーダル シートを表示せずに、このような「ユーザー インタラクション ブロック モード」を実装するにはどうすればよいかということです。
別のアイデア:すべてのコントロールを無効にする
すべてのコントロールを設定することを検討しisEnabled = false
ましたが、UI が任意に複雑になる可能性があり、メニューまたはキーボード ショートカットによるアクションを妨げないため、それはオプションではありません。