2009-07-21 75 views
2

我有一個奇怪的時間問題,看來。我打開一個uiimagepicker作爲模態視圖。當用戶選擇一個圖像或我想拍攝圖像時,將其保存到一個變量中,然後打開一個電子郵件界面作爲模態視圖。dismissModalViewControllerAnimated非原子?

我的問題是,我在imagepicker上調用dismissModalViewController,然後爲我的電子郵件界面調用presentmodalviewcontroller,但imagepicker沒有及時離開電子郵件視圖。有沒有辦法「等待」那行代碼來完成?

(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 2009-07-23 05:15:39

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

這對我有用。謝謝! – 2010-02-06 21:39:42

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。 – 2012-03-07 08:24:12

0

我有一個類似的問題,並認爲它是一個設計問題。我建議,而不是這樣做的:

根VC呈現圖像VC
根VC駁回圖像VC
[同時解僱和在座的原因的問題]
根VC呈現電子郵件VC
根VC駁回電子郵件VC

你這樣做:

根VC呈現圖像VC
圖像VC預sents電子郵件vc
root vc關閉vc棧

請記住,dismissModalViewController可以關閉整個控制器堆棧以便到達調用者。請參閱UIViewController的文檔。

VC = - 視圖 - 控制器

0

我使用的圖像拾取和dismissModalViewControllerAnimated被撤消我的目標之一。我發現我必須保存和恢復我的價值。

這對我來說(集團BigBlockViewController是我班)什麼工作:

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

我的照片選擇器從flipsideViewController

相關問題