2009-07-23 9 views
0

複数のモーダルビューを順番に表示したいとします(画像ピッカーから画像を選択した後に表示確認ページを表示するなど)。私の問題は、遅れのない後続のステップでの解雇とプレゼンテーションのアニメーションは、常にEXC_BAD_ACCESSでアプリをクラッシュさせるということです。複数のモーダルビュートランジションクラッシュアプ​​リケーション

CoreAnimationは2つのトランジションを区別せず、最初のトランジションが終了したかどうかを正しく検出できないとします。

これまでのところ、問題を解決するように見える1つのセクションの遅延を導入することが私の仕事です。しかし、これはコードが少し壊れやすいと思います。別の回避策がありますか?

これはUIKitのバグですか?バグレポートを送信する必要がありますか?

サンプルコードここで

クラッシュを再現単純なケースである:

  1. は、メインコントローラ

  2. の実装として次のクラスを使用して新しいビューベースのプロジェクトを作成します。
  3. 画像ピッカービューが表示されているときに「キャンセル」をクリックしてください

予想される動作:ピッカービューは、後でviewDidAppearを呼び出したために再び表示され、表示されます。

実際の動作:以下に示すスタックトレースでクラッシュします。

コード:


#import "SampleViewController.h" 

@implementation SampleViewController 

- (void)showModal { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    [self presentModalViewController:picker animated:YES]; 
    // [picker release]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self showModal]; // this line crashes the app 
    // the following works as desired 
    // [self performSelector:@selector(showModal) withObject:nil afterDelay:1]; 
} 

@end 

クラッシュスタックトレース:

 
#0 0x30b43212 in -[UIWindowController transitionViewDidComplete:fromView:toView:] 
#1 0x3095828e in -[UITransitionView notifyDidCompleteTransition:] 
#2 0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] 
#3 0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:] 
#4 0x00b54331 in run_animation_callbacks 
#5 0x00b54109 in CA::timer_callback 
#6 0x302454a0 in CFRunLoopRunSpecific 
#7 0x30244628 in CFRunLoopRunInMode 
#8 0x32044c31 in GSEventRunModal 
#9 0x32044cf6 in GSEventRun 
#10 0x309021ee in UIApplicationMain 
#11 0x00002794 in main at main.m:14 

答えて

8

チャンスはあなたがアニメーションコンテキスト仕上げを聞かせする必要があります。すでに発見したように

[self performSelector:@selector(showModal)withObject:nil afterDelay:1];

作品が、明らかに、遅延を持つことは良くないので、この操作を行います。

[self performSelector:@selector(showModal) withObject:nil afterDelay:0.0]; 

をごafterDelay使用する場合:それは直接セレクタを呼び出すことはありません0.0を、代わりにそれはあなたの実行ループで呼び出しをエンキューrunloopがイベントの処理を開始すると、すべての状態(自動解放プール、アニメーションコンテキストなど)が正しくuwnindされ、呼び出しがすぐに呼び出されます。

クループかもしれない一つの問題は、ユーザーがUIEventsは、画面をタップしてオフに軌道に乗る可能性があることですが、あなたはあなたを持っている一度あなたがアニメーションしている前にこれを呼び出すことによってでそれを修正することができます

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

、これを起動します画面

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

の最終的なモーダルは一般的に、あなたはとにかく迅速な遷移をアニメーション化している間、UIの相互作用を過ごしたいです。

+0

遅延を0.0として使用すると問題が解決します。ありがとう! – notnoop

+1

+1は 'beginIgnoringInteractionEvents'の提案です。以前はそれを知りませんでした。 – chakrit

関連する問題