2

我似乎有一个奇怪的时间问题。我打开一个 uiimagepicker 作为模式视图。当用户选择图像或我想要拍摄图像时,将其保存到变量中,然后以模态视图的形式打开电子邮件界面。

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

}   
}

我很确定我设计错了,但如果可以的话,请帮助我。

4

5 回答 5

6
于 2009-07-21T18:03:07.633 回答
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;
    }];
}
于 2010-08-23T17:26:05.920 回答
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 的调用成功。

于 2009-08-19T18:42:42.750 回答
0

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

根 vc 呈现图像 vc
根 vc 解除图像 vc
[同时解除并在此处显示原因问题]
根 vc 呈现电子邮件 vc
根 vc 解除电子邮件 vc

你做:

root vc 呈现图像 vc
图像 vc 呈现电子邮件 vc
root vc 关闭 vc 堆栈

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

vc = 视图控制器

于 2011-08-30T03:39:29.837 回答
0

我正在使用图像选择器,并且dismissModalViewControllerAnimated 正在撤消我的一个对象。我发现我必须保存和恢复我的价值。

这对我有用(Group 和 BigBlockViewController 是我的课程):

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

我的照片选择器是从 FlipsideViewController 执行的

于 2012-03-06T19:03:17.573 回答