2009-07-23 2 views
0

여러 개의 모달보기를 순서대로 표시하고 싶습니다 (예 : 이미지 선택기에서 그림을 선택한 후 표시 확인 페이지 표시). 내 문제는 해산 애니메이션과 후속 단계에서 지연없이 항상 EXC_BAD_ACCESS으로 앱이 충돌한다는 것입니다.여러 개의 모달보기 전환 충돌 응용 프로그램

CoreAnimation은 두 전환을 구분하지 않으며 처음 전환이 끝났는지 여부를 제대로 감지하지 못한다고 가정합니다.

내 작업은 지금까지 문제를 해결하는 것으로 보이는 1 섹션 지연을 소개하는 것입니다. 그러나 이것은 코드가 약간 깨지기 쉬운 것으로 생각합니다. 다른 해결 방법이 있습니까?

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이 이벤트를 처리하기 시작할 때 모든 상태 (자동 풀 풀, 애니메이션 컨텍스트 등)가 올바르게 호출 된 다음 호출을 즉시 호출 할 수있게합니다. 당신이 애니메이션

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

시작되기 전에 크룹 수

한 문제는 사용자가 UIEvents가 화면을 눌러 떨어져 가고 얻을 수 있지만,이를 호출하여 함께 그 문제를 해결할 수 있다는 것입니다 그리고 한 번이가 당신의 화면의 최종 모달

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 

일반적으로 빠른 전환을 애니메이션으로 처리하는 동안 UI 상호 작용을 사용하고 싶습니다.

+0

지연을 0.0으로 사용하면 문제가 해결됩니다! 감사! – notnoop

+1

+1은 'beginIgnoringInteractionEvents' 제안입니다. 전에는 전혀 몰랐습니다. – chakrit

관련 문제