12

これが簡単な質問であることを願っています。UINavigationController があり、新しいビュー コントローラーをアニメーション化されたトランジションでスタックにプッシュした場合、アニメーションが終了して新しいビュー コントローラーが画面に表示されたことをどのように検出できますか?

新しいコントローラーをプッシュして長時間実行する必要があるシナリオがいくつかあります。メインスレッドを長時間ブロックし始める前に、画面に何かが表示されるように、最初に新しいビューをプッシュしたいと思います。すぐにプッシュを実行し、その後に長時間実行されるタスクを実行すると、もちろん両方が完了し、メイン スレッドがイベントを再び処理できるようになるまで、ビューは表示されません。

それで、私がやりたいことは、アニメーションが完了してビューが画面に表示されたら、新しいコントローラーで検出してからタスクを開始できるようにすることです。

4

3 に答える 3

23

メインスレッドをまったくブロックしないという@DHamrickの推奨事項に+1。

元の質問に答えるために、次の 2 つの場所で viewController の変更を検出できます。

  1. プッシュしたばかりの viewController は、viewWillAppear:およびviewDidAppear:メッセージを受け取ります。特定の viewController がいつ表示されるかを知りたい場合は、これらのメソッドを実装します。

  2. navigationController:didShowViewController:animated:@Mike Z が言及したメソッドは、navigationController の delegate に送信されます。このメッセージを受信するには、そのデリゲートになるオブジェクトを割り当てる必要があります。これで、viewController が表示されるたびにわかります

于 2012-04-14T02:05:53.097 に答える
4

メイン スレッドをブロックする代わりに、GCD キューを使用して、長時間実行される操作を別のスレッド内で実行するか、さらに良い方法を検討する必要があります。

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL);
dispatch_async(backgroundQueue, ^{
    // Do your long running code
    dispatch_async(dispatch_get_main_queue(), ^{
        //Update your UI
    });
});

viewDidLoad:UI が既に読み込まれていることがわかるように、このコードを に配置できます。これは、アニメーションのタイミングに依存する必要がないことも意味します。

于 2012-04-14T01:38:42.283 に答える
3

私はこれを自分でテストしたり実装したりしていませんが、ドキュメントは次のように聞こえます:

navigationController:didShowViewController:animated:

説明: ナビゲーション コントローラーがビュー コントローラーのビューとナビゲーション項目のプロパティを表示した直後にレシーバーに送信されます。

さもないと、

setAnimationDidStopSelector:あなたのために働くものかもしれません。

説明: アニメーションが停止したときにアニメーション デリゲートに送信するメッセージを設定します。

于 2012-04-14T01:32:31.927 に答える