複数のモーダルビューを順番に表示したいとします(画像ピッカーから画像を選択した後に表示確認ページを表示するなど)。私の問題は、遅れのない後続のステップでの解雇とプレゼンテーションのアニメーションは、常にEXC_BAD_ACCESS
でアプリをクラッシュさせるということです。複数のモーダルビュートランジションクラッシュアプリケーション
CoreAnimation
は2つのトランジションを区別せず、最初のトランジションが終了したかどうかを正しく検出できないとします。
これまでのところ、問題を解決するように見える1つのセクションの遅延を導入することが私の仕事です。しかし、これはコードが少し壊れやすいと思います。別の回避策がありますか?
これはUIKitのバグですか?バグレポートを送信する必要がありますか?
サンプルコードここで
クラッシュを再現単純なケースである:
は、メインコントローラ
の実装として次のクラスを使用して新しいビューベースのプロジェクトを作成します。
画像ピッカービューが表示されているときに「キャンセル」をクリックしてください
予想される動作:ピッカービューは、後で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
遅延を0.0として使用すると問題が解決します。ありがとう! – notnoop
+1は 'beginIgnoringInteractionEvents'の提案です。以前はそれを知りませんでした。 – chakrit