dismissModalViewControllerAnimated非原子?(dismissModa

2019-09-20 01:04发布

我有一个奇怪的时机的问题,它似乎。 我打开一个uiimagepicker为模态的视图。 当用户选取的图像或我想借此形象,将其保存到一个变量,然后打开电子邮件接口作为modalview。

我的问题是,我在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];

}   
}

我敢肯定,我设计了一些错误,但如果你能帮助我。

Answer 1:

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

然而,这样会引入很多微妙的时机错误的,所以我建议使用它只是案件的最极端的。

我想你也许可以做一些与viewDidAppear:寻找那些你在设置一个标志didFinishPicking…这表明你等待imagePicker的动画结束。 由于它是didAppear,动画应该然后完成。



Answer 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];
}

我注意到的问题是,这里是当一些物体释放它的模态视图控制器保持周围的计时问题。 如果我打电话dismissModalViewController当retainCount仍然是2,则调用失败,只是......什么也没有发生。 但是,如果我等一下,保留计数一直下降到1,然后调用dismissModalViewController成功。



Answer 3:

而过渡正在发生,所有视图驻留在(的类型的中间视图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;
    }];
}


Answer 4:

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

根VC呈现图像VC
根VC驳回图像VC
[同时驳回和本引起问题这里]
根VC呈现电子邮件VC
根VC驳回电子邮件VC

你做:

VC VC呈现根图像
VC VC图像呈现电子邮件
VC VC根解散堆叠

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

VC = - 视图 - 控制器



Answer 5:

我使用的是图片选择器和dismissModalViewControllerAnimated被撤消我的目标之一。 我发现,我必须保存和恢复我的价值。

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

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

我的照片选择器从flipsideViewController执行



文章来源: dismissModalViewControllerAnimated nonatomic?