0

サーバーに非同期で接続しているときに、「読み込み画面」の UIViewController をプッシュする UINavigationController があります。プッシュは、そのスライド効果で暗黙的にアニメーション化されます。接続中にエラーが発生した場合は、読み込み画面のコントローラー (再びアニメーション) をポップして、ユーザーにアラートを表示します。

アニメーションが完了した後にビュー コントローラーをポップすれば問題ありませんが、アニメーションがまだ完了していない場合は奇妙なことが起こります。通常、ローディング画面のビューは、ナビゲーション コントローラー スタックからポップされても画面に残ります。問題は進行中のアニメーションに関係していると確信しています。たとえば、この不自然なコード スニペットは、常に secondController のビューを画面に残します。

[navController pushViewController: secondController animated: YES];
[navController popToRootViewControllerAnimated: YES];
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops");

私の現在の回避策は、デリゲートをナビゲーション コントローラーに登録し、navigationController:didShowViewController:animated: メソッドを実装することです。次に、最初のプッシュ アニメーションが完了したことがわかっている場合にのみ、ローディング スクリーン コントローラーをポップします。ただし、アニメーションを早期に終了することをお勧めします。

ナビゲーション コントローラーのビューのすべてのサブ ビューのレイヤー ツリー内のすべてのレイヤーで removeAllAnimations を呼び出そうとしました。このアプローチはアニメーションを早期に終了させましたが、ロード画面のビューがポップされた後も表示されたままになることがよくありました。基本的に、アニメーションを早期に終了する正しい方法はありますか?

4

2 に答える 2

0

ルートビューコントローラーをプッシュした直後にポップする理由を理解するのは難しいですが、このようなことをしなければならなかったときは、プッシュされているビューコントローラーにポップする必要があるかどうかを判断させます。したがって、secondControllerの-viewDidLoadで、ルートビューにポップするための条件が真であるかどうかを判断します。もしそうなら、それから呼び出すことによってそこからポップ

[[self navigationController] popViewControllerAnimated:YES];

また、これで問題が解決するわけではありませんが、代わりに-presentModalViewControllerを使用して「ロード画面」をプッシュすることを検討してください。

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

そしてそれはポップと同等です:

- (void)dismissModalViewControllerAnimated:(BOOL)animated
于 2009-08-08T21:27:50.277 に答える
0

完全にテストされていませんが、ビュー コントローラーのビューのコア アニメーション レイヤーからすべてのアニメーションを削除しようとしましたか?

[[[secondController view] layer] removeAllAnimations];
于 2009-08-10T08:13:13.883 に答える