2

ポップオーバーコントローラーからオプションを選択した後、選択が行われたことがデリゲートに通知されます。

ポップオーバーを閉じて画面から削除し、ユーザーにアクティビティインジケーターを表示したいと思います。

残念ながら、dismissPopoverの下のコードは、ポップオーバーが実際に消える前に実行されるため、何も起こらないように見えることなく長時間待機することになります。

- (void)itemSelected:(int)option {

    [popController dismissPopoverAnimated:YES];

    activityIndicator.hidden = NO;
    [activityIndicator startAnimating];

    switch (option) {
        case 0:
            // Do something that takes some time
            break;

        case 1:
            // Do something that takes even longer
            break;
    }

}

ポップオーバーを閉じた後、呼び出し元のViewControllerに制御を戻すための最良の方法は何ですか?

4

2 に答える 2

2

問題は、UI を変更してもすぐに変更されないことです。変更は実際にはキューに入れられ、次にメイン イベント ループが終了したときに発生します。これは通常すぐに行われるため、通常は違いを気にする必要はありません。UI の更新はすべてメイン スレッドで行われます。長い操作もメイン スレッドで行われるため、アプリは長い操作が完了するまで UI を更新しません。

解決策の 1 つは、Grand Central Dispatch を使用してこれらの操作を別のスレッドにオフロードすることです。これにより、操作が完了するまでメイン スレッドの実行を継続できます (そして UI の更新を継続できます)。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    [self performReallyLongOperation];
});

dispatch_release(queue);
于 2012-08-27T14:59:00.987 に答える
0

UIPopOverControllerのdelegateメソッドを使用popoverControllerDidDismissPopoverして、ポップオーバーが終了した後にコードを実行できます。

ヘッダ

<UIPopoverControllerDelegate>

実装

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    activityIndicator.hidden = NO;
    [activityIndicator startAnimating];

    switch (option) {
        case 0:
            // Do something that takes some time
            break;

        case 1:
            // Do something that takes even longer
            break;
    }

}
于 2012-08-27T13:54:10.630 に答える