3

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はアニメーション化されず、メインウィンドウは-doLotsOfTimeConsumingWork:が完了するまで表示されませ

更新 NSOperationSampleコードを確認したところ、そのように見えます。

4

1 に答える 1

1

2つのメモ:

まず、Cocoaでは、イベントの処理と描画はメインスレッドで行われます。したがって、そこで長いメソッドを同期的に呼び出すことは決して良い考えではありません(これがUIが応答しない理由です)。
そうです、他の方法と同様に、このメソッドからセカンダリスレッドに計算コストの高いタスクを渡す必要がありますIBAction

次に、[panel release]そのメソッドを呼び出すと、Cocoaのオブジェクト所有権のルールに違反します。したがって、その呼び出しなしでパネルをリークする場合は、パネルを作成しているメソッドでそれを修正する必要があります。

于 2011-01-14T16:35:11.157 に答える