dismissModalViewControllerAnimated非原子?

问题描述:

我有一个奇怪的时间问题,看来。我打开一个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]; 

} 
} 

我很确定我设计了一些错误的东西,但是如果可以,请帮我解决。

您可以使用performSelector:withObject:withDelay:等待一个给定的时间传递(创建具有代码后做的另一种方法。

然而,这会带来很多微妙的时机错误的,所以我建议使用它只有在最极端的情况下。

我想你也许可以做一些与viewDidAppear:找你已经在didFinishPicking…设置,表明你在等待imagePicker的动画结束的标志。因为它是didAppear中,动画应该在那时完成。

+0

感谢执行,这是非常有益的。 – Alfonsol 2009-07-23 05:15:39

我已经加入与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

当过渡发生时,所有视图都驻留在中间视图中(类型为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

我有一个类似的问题,并认为它是一个设计问题。我建议,而不是这样做的:

根VC呈现图像VC
根VC驳回图像VC
[同时解雇和在座的原因的问题]
根VC呈现电子邮件VC
根VC驳回电子邮件VC

你这样做:

根VC呈现图像VC
图像VC预sents电子邮件vc
root vc关闭vc栈

请记住,dismissModalViewController可以关闭整个控制器堆栈以便到达调用者。请参阅UIViewController的文档。

VC = - 视图 - 控制器

我使用的图像拾取和dismissModalViewControllerAnimated被撤消我的目标之一。我发现我必须保存和恢复我的价值。

这对我来说(集团BigBlockViewController是我班)什么工作:

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

我的照片选择器从flipsideViewController