ファイル/ディレクトリが選択されるとすぐにnsopenpanelを閉じます
-
11-10-2019 - |
質問
私はnsopenpanel/nssavepanel/nspanelを初めて使用しています。私はnsopenpanelを使用して、ファイルのアプリが繰り返されるディレクトリを選択し、かなり時間のかかる処理を行います。
パネルで-closeを呼び出すことはできますが、メインウィンドウに焦点を返しません。パネルを「却下」することについて多くのことを読みましたが、パネルやウィンドウを「閉じる」のではなく、「却下」する方法は見つかりませんでした。
バックグラウンドスレッド(nsoperation)を生成する必要があるということですか?
これが私の-choosedidend:returncode:contextinfo:
-(void) chooseDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
[panel orderOut:self];
[panel release];
if (returnCode == NSFileHandlingPanelOKButton)
{
[progressIndicator startAnimation:self];
[self doLotsOfTimeConsumingWork:[[panel URL] path]];
[progressIndicator stopAnimation:self];
}
}
nsopenpanelは消えますが、私のnsprogressindicatorはアニメーション化されず、メインウィンドウはまで生き生きとしていません 後 -dolotsoftimecosumingwork:完了します。
アップデート nsoperationsampleコードを見ただけで、それが道のりのように見えます。
解決
2つのメモ:
まず、ココアでは、イベントの取り扱いと図面がメインスレッドで行われます。したがって、そこに長い方法を同期させることは決して良い考えではありません(これがあなたの反応しないUIの理由です)。
したがって、はい、この方法からのように、この方法から計算上の高価なタスクを二次スレッドに引き渡す必要があります IBAction
.
第二に、電話 [panel release]
その方法では、ココアのオブジェクト所有ルールに違反します!そのため、その呼び出しなしでパネルを漏れている場合は、パネルを作成する方法でそれを修正する必要があります。