0

XCODE と Objective-C を使用する MAC では、スピナーとキャンセル ボタンを含む小さな「 BUSY 」ウィンドウを表示する必要があります。これにより、長い操作が完了するまで、ユーザーはアプリケーションで他の操作を行うことができなくなりますが、キャンセルをクリックすると、操作が停止するはずです。

キャンセルボタン付きのシンプルなNSWindowControllerベースのウィンドウを作成して、そのウィンドウをモーダルにしてみました....

-(void) start_long_operation {
...
...

[self showBusy];
return; // return to continue the long operation
}

// 「ビジー」ダイアログ ボックスを表示するので、ユーザーは完了するまで何もできません

-(void) showBusy {  
    BusyNSWindow *loadingView = [[LoadingView alloc] initWithWindowNibName:@"LoadingView"];<br>
    [[NSApplication sharedApplication] runModalForWindow:loadingView.window];  
}

// キャンセルがクリックされた場合、長時間の操作を停止するシグナルを送信し、「ビジー」ダイアログ ボックスを閉じます

-(IBAction) cancel
{
// cancel was clicked inside the "busy" dialog box so signal process to stop long operation
}



しかし、何が起こるかというと、それは の中にとどまり、[[NSApplication sharedApplication] runModalForWindow:loadingView.window]戻ってこないということです。「ビジー」ダイアログボックスが表示されている間に長い処理を続行できるように戻りたいので、これは機能しません。

キャンセル ボタンとスピナーを備えた小さな「ビジー」ウィンドウを作成し、ユーザーが操作が完了するまでそのウィンドウの外をクリックできないようにし、プログラムの残りの部分を正常に続行して、長時間運用?

-ラフネック

4

1 に答える 1

0

いずれにせよ、長い操作はメイン スレッドで行うべきではありません。NSOperationおよびNSOperationQueueを長時間実行操作に使用すると、バックグラウンドで実行され、モーダル ウィンドウが正常に動作します。

もう 1 つの方法は、あまり便利ではありませんが、「モーダル セッション」を使用することです。-beginModalSessionForWindow:の、-runModalSession:、および-endModalSession:メソッドを参照してくださいNSApplication。そのためには、長時間実行される操作を、順次呼び出すことができる高速実行ステップに分割する必要があります。

于 2013-02-10T20:25:24.470 に答える