サーバーに非同期で接続しているときに、「読み込み画面」の UIViewController をプッシュする UINavigationController があります。プッシュは、そのスライド効果で暗黙的にアニメーション化されます。接続中にエラーが発生した場合は、読み込み画面のコントローラー (再びアニメーション) をポップして、ユーザーにアラートを表示します。
アニメーションが完了した後にビュー コントローラーをポップすれば問題ありませんが、アニメーションがまだ完了していない場合は奇妙なことが起こります。通常、ローディング画面のビューは、ナビゲーション コントローラー スタックからポップされても画面に残ります。問題は進行中のアニメーションに関係していると確信しています。たとえば、この不自然なコード スニペットは、常に secondController のビューを画面に残します。
[navController pushViewController: secondController animated: YES];
[navController popToRootViewControllerAnimated: YES];
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops");
私の現在の回避策は、デリゲートをナビゲーション コントローラーに登録し、navigationController:didShowViewController:animated: メソッドを実装することです。次に、最初のプッシュ アニメーションが完了したことがわかっている場合にのみ、ローディング スクリーン コントローラーをポップします。ただし、アニメーションを早期に終了することをお勧めします。
ナビゲーション コントローラーのビューのすべてのサブ ビューのレイヤー ツリー内のすべてのレイヤーで removeAllAnimations を呼び出そうとしました。このアプローチはアニメーションを早期に終了させましたが、ロード画面のビューがポップされた後も表示されたままになることがよくありました。基本的に、アニメーションを早期に終了する正しい方法はありますか?