2009-07-23 77 views
0

我想按順序顯示多個模態視圖(例如,從圖像選擇器中選擇圖片後顯示確認頁面)。我的問題是,立即解僱和在隨後的步驟中呈現的動畫總是會以EXC_BAD_ACCESS崩潰應用程序。多模態視圖轉換崩潰應用程序

我假設問題是CoreAnimation沒有區分這兩個轉換並且無法正確檢測到第一個是否已經結束。

到目前爲止,我的工作是引入一段似乎解決問題的延遲。不過,我認爲這會使代碼有點脆弱。是否有另一種解決方法?

這是一個UIKit中的錯誤,我應該提交一個錯誤報告嗎?

示例代碼

這裏是重現崩潰一個簡單的例子:

  1. 下面的類作爲主控制器的實現創建一個新的基於視圖的項目

  2. 當呈現圖像選擇器視圖時點擊'取消'

預期行爲:由於後續調用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調用,它允許你的所有狀態(自動釋放池,動畫上下文等)正確地運行,然後在runloop開始處理事件時立即調用你的調用。

可能喉炎的一個問題是,用戶可以得到UIEvents通過點擊屏幕會關閉,但你可以通過調用此修復與你是動畫開始

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

之前,這一次,你有你屏幕上的最終模態

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

通常,您希望在使用UI交互時動畫快速切換。

+0

使用0.0作爲延遲解決了問題!謝謝! – notnoop 2009-07-23 16:58:44