2009-07-21 5 views
2

이상한 타이밍 문제가 있습니다. 모달 뷰로 uiimagepicker를 엽니 다. 사용자가 이미지를 선택하거나 이미지를 가져 오려면 변수에 저장 한 다음 전자 메일 인터페이스를 모달보기로 엽니 다.dismissModalViewControllerAnimated 비 원자형?

내 문제는 imagepicker에서 dismissModalViewController를 호출하고 내 전자 메일 인터페이스에 presentmodalviewcontroller를 호출하지만 이미지 피커가 전자 메일보기가 표시 될 때가 멀지는 않다는 것입니다. 해당 코드 행이 완료 될 때까지 '대기'할 수있는 방법이 있습니까?

(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
    if([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:@"public.image"]){ 
    [self dismissModalViewControllerAnimated:YES]; 
    imageFromCamera = [[UIImageView alloc] initWithImage:[info objectForKey:UIImagePickerControllerOriginalImage]]; 

    MFMailComposeViewController *mailView = [[MFMailComposeViewController alloc] init]; 
    mailView.mailComposeDelegate = self; 
    [self presentModalViewController:mailView animated:YES]; 
    [mailView release]; 

} 
} 

나는 틀린 무엇인가를 고안했다는 것을 확신하지만 가능하면 도와 줘.

답변

6

당신은

그러나,이 미묘한 타이밍 버그를 많이 소개 할 수 있습니다. 나중에 할 수있는 코드가 다른 방법을 만들 (전달하는 데 주어진 시간을 기다려야 performSelector:withObject:withDelay:을 사용할 수 있습니다, 그래서 그것을 사용하는 것이 좋습니다 것 가장 극단적 인 경우에만 사용하십시오

viewDidAppear:으로 설정할 수 있습니다. didFinishPicking…에 설정 한 플래그로 imagePicker의 애니메이션이 끝날 때까지 기다리고 있음을 알 수 있습니다. didAppear이므로 그때까지 애니메이션을 완료해야합니다.

+0

감사에서 수행, 즉 매우 도움이되었다. – Alfonsol

2

dismissModalViewController와 비슷한 문제를 일으켰고 그것은 나를 괴롭혔다. 내가 그것을 다룰 수 있었던 유일한 방법은 위에 제시된 것과 비슷한 일을하는 것이다. 나는이 해결책을 좋아하지 않지만 그것을 피하는 방법을 알아낼 수 없었다.

if ([self retainCount] == 1) 
    [self dismissModalViewControllerAnimated:YES];      
else { 
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; 
} 

- (void)onTimer:(NSTimer*)theTimer { 
    [self dismissModalViewControllerAnimated:YES]; 
    [theTimer invalidate]; 
} 

내가 알아 차린 문제점은 모달 뷰 컨트롤러에서 보류를 해제 할 때의 타이밍 문제입니다. 그리고 retainCount가 여전히 2 일 때 dismissModalViewController를 호출하면 호출이 실패합니다 ... 아무 일도 일어나지 않습니다. 하지만 잠깐 기다리면 보유 수는 항상 1로 떨어지고 dismissModalViewController 호출이 성공합니다.

+0

이것은 나를 위해 일했습니다. 감사! –

2

전환이 진행되는 동안 모든보기는 중간보기 (유형 : UITransitionView)에 있습니다. 그래서 메인 윈도우의 직접 하위 뷰라는 것을 알고있는 콘센트를 선택하고 !([[outlet superview] isKindOfClass:[UIWindow class]])을 확인하고 실행을 performSelector:withObject:withDelay:으로 지연 시키면 관련된 모든 정보를 전달하여 현재있는 메소드를 호출하고 간단히 리턴하십시오.

전환이 완료되면 조건이 더 이상 충족되지 않고 새 애니메이션이 발생할 수 있습니다. 이 방법은 performSelector:withObject:withDelay:을 한 번 호출하면 발생할 수있는 타이밍 복잡성에 취약하지 않습니다.

나는 최근이 사용하고 (이 더 간단하게 메인 창에 콘센트 가지고 난 그냥 일이) 잘 작동합니다

//Called after [initialRootViewController dismissModalViewControllerAnimated:YES] 
- (void)showTable { 
    if([initialRootViewController.view superview] != window) { 
     //View is still animating 
     [self performSelector:@selector(showTable) withObject:nil afterDelay:0.1]; 
     return; 
    } 
    self.nibContents = [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil]; 
    [UIView transitionFromView:initialRootViewController.view toView:rootViewController.view duration:0.3 options:UIViewAnimationOptionTransitionCurlUp|UIViewAnimationOptionBeginFromCurrentState completion:^(BOOL finished){ 
     self.initialRootViewController = nil; 
    }]; 
} 
+0

이 방법은 저에게 큰 도움이되었습니다. 테스트를 변경하여 initialRootViewController.view superview! = NULL인지 확인합니다. 뷰의 애니메이션이 끝나면 NULL이됩니다. –

0

나는 비슷한 문제가 발생하고 믿고 오전 디자인 문제.내가 대신 일을 제안 :

루트 VC 이미지 VC에게 제시
루트 VC 이미지 VC를 일축
[동시 닫고 여기에 현재의 문제를 야기]
루트 VC 루트 VC 이메일 VC를 일축
이메일 VC에게 제시

당신은 할 수 :

루트 VC 이미지 VC에게
이미지 VC 사전을 제공합니다 sents email vc
root vc는 vc 스택을 닫습니다.

dismissModalViewController는 전체 컨트롤러 스택을 닫아 호출자에게 전달할 수 있습니다. UIViewController에 대한 설명서를 참조하십시오. 나는 이미지 선택기를 사용하고 있고 dismissModalViewControllerAnimated 내 개체 중 하나를 취소한다 =보기 컨트롤러

0

VC. 나는 나의 가치를 저장하고 회복해야한다는 것을 알았다.

이 나를 (그룹 및 BigBlockViewController 내 클래스입니다) 근무 무엇 :

Group *workAround = bigBlockViewController.selectedGroup; 
[picker dismissModalViewControllerAnimated:YES]; 
bigBlockViewController.selectedGroup = workaround; 

내 사진 선택기가있는 FlipsideViewController

관련 문제