当演示者是UITabbarController子节点时,为什么UIActivityViewController不会忽略MFMailComposeViewController?

时间:2013-11-05 07:36:56

标签: ios uitabbarcontroller uiactivityviewcontroller

我有一个非常简单的例子,其中一个按钮显示UIActivityViewController以共享一些内容。问题是当用户取消或发送电子邮件时,邮件编辑器不会被解雇。

NSArray *items = [NSArray arrayWithObjects:@"share",nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];

我试图忽略 activityViewController.completionHandler 中的模态视图,但随后控制台说另一个动画正在进行中,有时会使应用程序崩溃,所以这不是解决方案。除了其他社交网络运作良好(脸书,推特),没有做任何事情。

经过一些测试后,我发现只有在呈现UIActivityViewController的UIViewController是UITabBarController的子节点时才会发生这种情况。 如果在我的AppDelegate中我创建了这样的应用程序它不起作用:

UIViewController > UINavigationController > UITabbarController > Window

但如果我删除标签栏一切正常!:

UIViewController > UINavigationController > Window 

解决问题的解决方法是从rootviewcontroller中呈现。

[self.view.window.rootViewController presentViewController:activityViewController animated:YES completion:NULL];

但我想知道这里发生了什么。

谢谢! ;)

1 个答案:

答案 0 :(得分:0)

我有同样的问题,在搞清楚之后我知道当我们没有从窗口中当前活动的类中呈现邮件编写器时,它将无法在某个时间采取响应,因为它甚至不会出现每次通话,同样是解散的问题。  这不仅仅是UITabbarController的情况。当您从不同的控制器(当前不在窗口中)呈现它时,它可能发生在任何体系结构上。这就是为什么您的解决方法正常工作并且没有错误。

我正在通过uipopover内部的按钮呈现邮件编辑器。邮件编辑器正在该popover控制器类中呈现。我面临着你面临的同样问题。然后我将代码更改为:

MFMailComposeViewController *mailComposer = [MFMailComposeViewController new];

    [mailComposer addAttachmentData:data mimeType:@"application/pdf" fileName:model.documentTitle];

    [mailComposer setSubject:model.documentTitle]; // Use the document file name for the subject

    if(kBccEmailID)
        [mailComposer setBccRecipients:[[NSArray alloc]initWithObjects:kBccEmailID, nil ]];

    mailComposer.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    mailComposer.modalPresentationStyle = UIModalPresentationFormSheet;

    AppDelegate *delagate =(AppDelegate *) [[UIApplication sharedApplication]delegate];

    mailComposer.mailComposeDelegate = [[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject]; // Set the delegate


    [(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject] presentViewController:mailComposer animated:YES completion:nil];

[(UIViewController *)[[(UINavigationController *)delagate.window.rootViewController viewControllers] lastObject]是'self.view.window.rootViewController'的替代选择。