dismissModalViewControllerAnimated需要在从superview中删除之前先完成动画制作吗?

时间:2012-01-22 21:41:03

标签: ios cocoa-touch

我已经实现了MFMailComposeViewController并遇到了问题。

在我的超级视图中,我实施了一个按钮,按下后,会显示应用内电子邮件。 一切正常,直到用户发送或关闭邮件表格。

似乎我需要等待动画(关闭电子邮件表单)才能首先结束,然后才能运行[self.view removeFromSuperview];。如果在动画结束之前运行此行没有任何操作并且视图未被删除,因此我无法点击屏幕上的任何内容,因为当前的UIView未被删除。

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {

    [self dismissModalViewControllerAnimated:YES];

    // Removes the view so that delegate is passed back to the superview
    [self.view removeFromSuperview];

}

我的超级视图操作调用了该类:

- (IBAction)buttonPressedSendMail {
    MailComposerViewController *mailComposer = [[MailComposerViewController alloc] init];
    [self addSubview:mailComposer.view];
    [mailComposer sendMail:nil];
}

[[self view] setHidden:YES];隐藏UIView的作品,但我不认为这是正确的做法。

2 个答案:

答案 0 :(得分:3)

使用presentModalViewController呈现视图控制器:动画:

MailComposerViewController *mailComposer = [[MailComposerViewController alloc] init];
[self presentModalViewController:mailComposer animated:YES];

然后像你一样关闭模态视图

[self dismissModalViewControllerAnimated:YES];

无需添加或删除视图控制器的视图。

答案 1 :(得分:1)

您可以使用dispatch_after块。您可以在邮件编辑器解除后调整delayInSeconds。

double delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self.view removeFromSuperview];
    });

或者你可以试试这个:

[self dismissViewControllerAnimated:YES completion:^ {     [self.view removeFromSuperview]; }];